Skip to content

Commit f4ba0be

Browse files
committed
Progress on urly
1 parent ebee915 commit f4ba0be

File tree

4 files changed

+143
-16
lines changed

4 files changed

+143
-16
lines changed

TODO.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,21 @@
2929

3030
- [ ] Print initial offset (optional)
3131

32+
## urly
33+
34+
- [ ] defaultport/nodefaultport
35+
- [ ] punycode/idn - conversion to/from punycode
36+
- [ ] sort: sort params
37+
- [ ] arrays: switch multi-value params between different formats
38+
- [ ] note about https://curl.se/trurl/manual.html
39+
- [ ] set: set a parameter
40+
- [ ] add: add a parameter
41+
- [ ] remove: remove a parameter
42+
- [ ] get: get a parameter value, first value if array (always a string)
43+
- [ ] getall: get all values (always an array)
44+
- [ ] pathset: set a specific index of the path
45+
- [ ] mask: replace parts with asterisk (or --maskchar)
46+
3247
## Hexview (new)
3348

3449
- [ ] show `hexdump -C` interactively

bin/run-urly.sh

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#!/usr/bin/env bash
2+
#
3+
# run locally
4+
#
5+
6+
set -o errexit
7+
set -o nounset
8+
set -o pipefail
9+
10+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11+
REPO_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
12+
13+
cd "${REPO_DIR}"
14+
15+
go build -o ./dist/urly ./cmd/urly
16+
17+
./dist/urly --username=me https://www.example.com/
18+
PASSWORD=thepassword ./dist/urly --password-env=PASSWORD https://me@www.example.com/

cmd/urly/urly.go

Lines changed: 51 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"net/url"
77
"os"
8+
"strings"
89

910
"github.com/FileFormatInfo/fftools/internal"
1011
"github.com/spf13/pflag"
@@ -112,6 +113,10 @@ func main() {
112113
var fragment = pflag.String("fragment", "", "Set the URL fragment")
113114
var noFragment = pflag.Bool("no-fragment", false, "Remove the URL fragment")
114115

116+
var addParams = pflag.StringArray("addparam", []string{}, "Add a query parameter (key=value)")
117+
var setParams = pflag.StringArray("setparam", []string{}, "Set a query parameter (key=value)")
118+
var delParams = pflag.StringArray("delparam", []string{}, "Delete a query parameter (key)")
119+
115120
var envUrl = pflag.String("url-env", "", "Environment variable containing the URL to process")
116121

117122
var output = pflag.String("output", "url", "Output type: url, scheme, host, port, path, query, fragment, userinfo, username, password")
@@ -241,6 +246,40 @@ func main() {
241246
theUrl.RawQuery = *query
242247
}
243248

249+
if len(*setParams) > 0 {
250+
queryValues := theUrl.Query()
251+
for _, param := range *setParams {
252+
kv := strings.SplitN(param, "=", 2)
253+
if kv[0] != "" {
254+
queryValues.Set(kv[0], kv[1])
255+
}
256+
}
257+
theUrl.RawQuery = queryValues.Encode()
258+
}
259+
260+
if len(*delParams) > 0 {
261+
queryValues := theUrl.Query()
262+
for _, key := range *delParams {
263+
queryValues.Del(key)
264+
}
265+
theUrl.RawQuery = queryValues.Encode()
266+
}
267+
268+
if len(*addParams) > 0 {
269+
queryValues := theUrl.Query()
270+
for _, param := range *addParams {
271+
kv := strings.SplitN(param, "=", 2)
272+
if kv[0] != "" {
273+
if len(kv) > 1 {
274+
queryValues.Add(kv[0], kv[1])
275+
} else {
276+
queryValues.Add(kv[0], "")
277+
}
278+
}
279+
}
280+
theUrl.RawQuery = queryValues.Encode()
281+
}
282+
244283
if *noFragment {
245284
theUrl.Fragment = ""
246285
} else if *fragment != "" {
@@ -249,9 +288,20 @@ func main() {
249288

250289
switch *output {
251290
case "url":
252-
fmt.Println(theUrl.String())
291+
fmt.Print(theUrl.String())
253292
case "scheme":
254293
fmt.Print(theUrl.Scheme)
294+
case "username":
295+
if theUrl.User != nil {
296+
fmt.Print(theUrl.User.Username())
297+
}
298+
case "password":
299+
if theUrl.User != nil {
300+
password, hasPassword := theUrl.User.Password()
301+
if hasPassword {
302+
fmt.Print(password)
303+
}
304+
}
255305
case "host":
256306
fmt.Print(theUrl.Hostname())
257307
case "port":
@@ -271,17 +321,6 @@ func main() {
271321
fmt.Print(password)
272322
}
273323
}
274-
case "username":
275-
if theUrl.User != nil {
276-
fmt.Print(theUrl.User.Username())
277-
}
278-
case "password":
279-
if theUrl.User != nil {
280-
password, hasPassword := theUrl.User.Password()
281-
if hasPassword {
282-
fmt.Print(password)
283-
}
284-
}
285324
case "json":
286325
fmt.Print(toJson(theUrl, true))
287326
case "jsonl":

testdata/urly.txt

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,82 @@
1+
# set username from args
12
exec urly --username=me https://www.example.com/
23
stdout 'https://me@www.example.com/'
34

4-
# set both username and password
5+
# set username from env
6+
env URLY_USER=envme
7+
exec urly --username-env=URLY_USER https://www.example.com/
8+
stdout 'https://envme@www.example.com/'
9+
10+
# set both username and password from env
511
env DB_PASSWORD=the-db-password
612
env DB_USERNAME=who-am-i
713
env DB_URL=postgres://myhosted-server.example.com/default?sslmode=disabled
814
exec urly --username-env=DB_USERNAME --password-env=DB_PASSWORD --url-env=DB_URL
915
stdout 'postgres://who-am-i:the-db-password@myhosted-server\.example\.com/default\?sslmode=disabled'
1016

11-
# set just password
17+
# set password from env
1218
env DB_PASSWORD=the-db-password
1319
env DB_URL=postgres://who-am-i@myhosted-server.example.com/default?sslmode=disabled
14-
exec urly --username-env=DB_USERNAME --password-env=DB_PASSWORD --url-env=DB_URL
20+
exec urly --password-env=DB_PASSWORD --url-env=DB_URL
1521
stdout 'postgres://who-am-i:the-db-password@myhosted-server\.example\.com/default\?sslmode=disabled'
1622

17-
# fix the scheme
23+
# change the scheme
1824
exec urly --scheme=postgresql postgres://user@server.example.com/db
1925
stdout 'postgresql://user@server\.example\.com/db'
2026

2127
# json output
2228
exec urly --output=jsonl https://u:p@example.com/path/to/file.ext?param=value
2329
stdout '{"scheme":"https","hostname":"example\.com","host":"example\.com","port":"","path":"/path/to/file\.ext","query":"param=value","fragment":"","username":"u","password":"p","url":"https://u:p@example\.com/path/to/file\.ext\?param=value","params":{"param":\["value"\]}}'
2430

31+
# get the scheme
32+
exec urly --output=scheme https://user:pswd@host.example.com/path/to/file?querykey=value#fragment
33+
stdout 'https'
34+
35+
# get the username
36+
exec urly --output=username https://username:pswd@host.example.com/path/to/file?querykey=value#fragment
37+
stdout 'username'
38+
39+
# get the password
40+
exec urly --output=password https://user:pswd@host.example.com/path/to/file?querykey=value#fragment
41+
stdout 'pswd'
42+
43+
# get the host
44+
exec urly --output=host https://user:pswd@host.example.com/path/to/file?querykey=value#fragment
45+
stdout 'host.example.com'
46+
47+
# get the path
48+
exec urly --output=path https://user:pswd@host.example.com/path/to/file?querykey=value#fragment
49+
stdout '/path/to/file'
50+
51+
# get the query
52+
exec urly --output=query https://user:pswd@host.example.com/path/to/file?querykey=value&key2=val2#fragment
53+
stdout 'querykey=value&key2=val2'
54+
55+
# get the fragment
56+
exec urly --output=fragment 'https://user:pswd@host.example.com/path/to/file?querykey=value&key2=val2#fraggers'
57+
stdout 'fraggers'
58+
59+
# set a parameter
60+
exec urly --output=query --setparam p=q 'https://user:pswd@host.example.com/path/to/file?querykey=value&key2=val2'
61+
stdout 'key2=val2&p=q&querykey=value'
62+
63+
# set two parameters
64+
exec urly --output=query --setparam p=q --setparam a=b 'https://user:pswd@host.example.com/path/to/file?querykey=value&key2=val2'
65+
stdout 'a=b&key2=val2&p=q&querykey=value'
66+
67+
# set (and override one) parameters
68+
exec urly --output=query --setparam p=q --setparam a=b --setparam key2=val3 'https://user:pswd@host.example.com/path/to/file?querykey=value&key2=val2'
69+
stdout 'a=b&key2=val3&p=q&querykey=value'
70+
71+
# add a parameter
72+
exec urly --output=query --addparam key2=val3 'https://user:pswd@host.example.com/path/to/file?querykey=value&key2=val2'
73+
stdout 'key2=val2&key2=val3&querykey=value'
74+
75+
# set a parameter
76+
exec urly --setparam p=q 'https://user:pswd@host.example.com/path/to/file?querykey=value&key2=val2'
77+
stdout 'https://user:pswd@host.example.com/path/to/file\?key2=val2&p=q&querykey=value'
2578
# add a parameter
2679
# remove a parameter
2780
# remove all parameters
81+
#https://user:pswd@host.example.com/path/to/file?key2=val2&p=q&querykey=value
82+
#https://user:pswd@host.example.com/path/to/file?key2=val2&p=q&querykey=value

0 commit comments

Comments
 (0)