From bc65345f6e5cb6bfd10ee1b7a8a4f7f8da447c41 Mon Sep 17 00:00:00 2001 From: Dave Molk Date: Mon, 5 Dec 2022 06:05:53 -0700 Subject: [PATCH] add rp --- README.md | 3 +++ rp/main.go | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++ rp/readme.md | 33 +++++++++++++++++++++++ rp/urls.txt | 4 +++ 4 files changed, 116 insertions(+) create mode 100644 rp/main.go create mode 100644 rp/readme.md create mode 100644 rp/urls.txt diff --git a/README.md b/README.md index 5513e83..676be09 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,9 @@ parse urls in style. read urls from a line-separated file or from stdin. Get dom ## pw need a kinda sorta safe(ish?) password and too lazy to log into your pw manager or some rando genderating rando site? type something in and get a mostly gibberish password that contains at least one lower-case letter, one upper-case, one special character, and one number. there are, of course, much easier ways to do this -- I was mainly interested in practicing pipelines :) +## rp +replace a key=value parameter in a given URL(s) with your own key=value. Bonus! Pipe in an encoded mess and decode it. + ## tas throw against site (pull down archived links from Wayback Machine, run against the site, see what status codes currently are) diff --git a/rp/main.go b/rp/main.go new file mode 100644 index 0000000..13f0604 --- /dev/null +++ b/rp/main.go @@ -0,0 +1,76 @@ +package main + +import ( + "bufio" + "flag" + "fmt" + "log" + "net/url" + "os" + "strings" +) + +func main() { + var d bool + var kv string + flag.BoolVar(&d, "d", false, "decode query string(s)") + flag.StringVar(&kv, "kv", "", "given key, replace value(s)") + flag.Parse() + + if !d && kv == "" { + log.Fatal("must select d or v") + } + + exit := make(chan struct{}) + if d { + go decode(exit) + } else { + go replaceValue(exit, kv) + } + + <-exit +} + +func decode(exit chan struct{}) { + defer close(exit) + s := bufio.NewScanner(os.Stdin) + for s.Scan() { + d, err := url.QueryUnescape(s.Text()) + if err != nil { + log.Fatal(err) + } + fmt.Println(d) + } + if err := s.Err(); err != nil { + fmt.Println(err) + } +} + +func replaceValue(exit chan struct{}, kv string) { + defer close(exit) + + p := strings.Split(kv, "=") + if len(p) != 2 { + log.Fatal("must supply input as key=value") + } + key := p[0] + value := p[1] + + s := bufio.NewScanner(os.Stdin) + for s.Scan() { + u, err := url.ParseRequestURI(s.Text()) + if err != nil { + log.Println(err) + continue + } + params := u.Query() + + params.Set(key, value) + + u.RawQuery = params.Encode() + fmt.Println(u.String()) + } + if err := s.Err(); err != nil { + fmt.Println(err) + } +} \ No newline at end of file diff --git a/rp/readme.md b/rp/readme.md new file mode 100644 index 0000000..95278db --- /dev/null +++ b/rp/readme.md @@ -0,0 +1,33 @@ +# replace params +Replace a key=value parameter in a given URL(s) with your own key=value. Bonus! Pipe in an encoded mess and decode it. + +## Flags +``` +-q: query parameter as key=value +-d: decode mode +``` + +## Test URLs +``` +https://example.com/foo/bar?first=1&second=2 +https://example.com/bar?foo=me&baz=barz +https://www.google.com/search?name=golang&language=en&mascot=gopher&foo=bar +google.com +``` + +## Usage +(replace a value) +``` +cat urls.txt | rp -v foo=bar +https://example.com/foo/bar?first=1&foo=bar&second=2 // adds &foo=bar +https://example.com/bar?baz=barz&foo=bar // overwrites value for preexisting key +https://www.example.com/rp?foo=bar&language=en&mascot=gopher&name=golang // kv already exists +2022/12/05 05:52:44 parse "google.com": invalid URI for request // no thanks +``` + +(decode query string(s)) +``` +echo "cart=%5B%5B0%2C+%7B%22logo%22%3A+%22kitten.jpg%22%2C+%22price%22%3A+0%2C+%22name%22%3A+%22Kitten%22%2C+%22desc%22%3A+%228%5C%22x10%5C%22+color+glossy+photograph+of+a+kitten.%22%7D%5D%2C+%5B0%2C+%7B%22logo%22%3A+%22kitten.jpg%22%2C+%22price%22%3A+0%2C+%22name%22%3A+%22Kitten%22%2C+%22desc%22%3A+%228%5C%22x10%5C%22+color+glossy+photograph+of+a+kitten.%22%7D%5D%2C+%5B1%2C+%7B%22logo%22%3A+%22puppy.jpg%22%2C+%22price%22%3A+0%2C+%22name%22%3A+%22Puppy%22%2C+%22desc%22%3A+%228%5C%22x10%5C%22+color+glossy+photograph+of+a+puppy.%22%7D%5D%5D" | rp -d + +cart=[[0, {"logo": "kitten.jpg", "price": 0, "name": "Kitten", "desc": "8\"x10\" color glossy photograph of a kitten."}], [0, {"logo": "kitten.jpg", "price": 0, "name": "Kitten", "desc": "8\"x10\" color glossy photograph of a kitten."}], [1, {"logo": "puppy.jpg", "price": 0, "name": "Puppy", "desc": "8\"x10\" color glossy photograph of a puppy."}]] +``` \ No newline at end of file diff --git a/rp/urls.txt b/rp/urls.txt new file mode 100644 index 0000000..de49b6b --- /dev/null +++ b/rp/urls.txt @@ -0,0 +1,4 @@ +https://example.com/foo/bar?first=1&second=2 +https://example.com/bar?foo=me&baz=barz +https://www.example.com/rp?name=golang&language=en&mascot=gopher&foo=bar +google.com \ No newline at end of file