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" :
0 commit comments