URL parser in Golang


The URL parser helps to collect all arguments data from URL.

Example

package main

import (
	"fmt"
	"log"
	"net"
	"net/url"
	"strings"
)

func main() {

	var links = []string{"https://analytics.google.com/analytics/web/#embed/report-home/a98705171w145119383p149829595/",
		"jdbc:mysql://test_user:ouupppssss@localhost:3306/sakila?profileSQL=true",
		"https://bob:pass@testing.com/country/state",
		"http://www.golangprograms.com/",
		"mailto:John.Mark@testing.com",
		"https://www.google.com/search?q=golang+print+string+10+times&oq=golang+print+string+10+times&aqs=chrome..69i57.8786j0j8&sourceid=chrome&ie=UTF-8",
		"urn:oasis:names:description:docbook:dtd:xml:4.1.2",
		"https://stackoverflow.com/jobs?med=site-ui&ref=jobs-tab",
		"ssh://mark@testing.com",
	}
	for _, link := range links {

		fmt.Println("URL:", link)

		u, err := url.Parse(link)
		if err != nil {
			log.Println(err)
			continue
		}

		parserURL(u)
		fmt.Println(strings.Repeat("#", 50))
		fmt.Println()
	}
}

func parserURL(u *url.URL) {
	fmt.Println("Scheme:", u.Scheme)
	if u.Opaque != "" {
		fmt.Println("Opaque:", u.Opaque)
	}
	if u.User != nil {
		fmt.Println("Username:", u.User.Username())
		if pwd, ok := u.User.Password(); ok {
			fmt.Println("Password:", pwd)
		}
	}
	if u.Host != "" {
		if host, port, err := net.SplitHostPort(u.Host); err == nil {
			fmt.Println("Host:", host)
			fmt.Println("Port:", port)
		} else {
			fmt.Println("Host:", u.Host)
		}
	}
	if u.Path != "" {
		fmt.Println("Path:", u.Path)
	}
	if u.RawQuery != "" {
		fmt.Println("RawQuery:", u.RawQuery)
		m, err := url.ParseQuery(u.RawQuery)
		if err == nil {
			for k, v := range m {
				fmt.Printf("Key: %q Values: %q\n", k, v)
			}
		}
	}
	if u.Fragment != "" {
		fmt.Println("Fragment:", u.Fragment)
	}
}

Output

URL: https://analytics.google.com/analytics/web/#embed/report-home/a98705171w145119383p149829595/
Scheme: https
Host: analytics.google.com
Path: /analytics/web/
Fragment: embed/report-home/a98705171w145119383p149829595/
##################################################

URL: jdbc:mysql://test_user:ouupppssss@localhost:3306/sakila?profileSQL=true
Scheme: jdbc
Opaque: mysql://test_user:ouupppssss@localhost:3306/sakila
RawQuery: profileSQL=true
Key: "profileSQL" Values: ["true"]
##################################################

URL: https://bob:pass@testing.com/country/state
Scheme: https
Username: bob
Password: pass
Host: testing.com
Path: /country/state
##################################################

URL: http://www.golangprograms.com/
Scheme: http
Host: www.golangprograms.com
Path: /
##################################################

URL: mailto:John.Mark@testing.com
Scheme: mailto
Opaque: John.Mark@testing.com
##################################################

URL: https://www.google.com/search?q=golang+print+string+10+times&oq=golang+print+string+10+times&aqs=chrome..69i57.8786j0j8&sourceid=chrome&i
e=UTF-8
Scheme: https
Host: www.google.com
Path: /search
RawQuery: q=golang+print+string+10+times&oq=golang+print+string+10+times&aqs=chrome..69i57.8786j0j8&sourceid=chrome&ie=UTF-8
Key: "q" Values: ["golang print string 10 times"]
Key: "oq" Values: ["golang print string 10 times"]
Key: "aqs" Values: ["chrome..69i57.8786j0j8"]
Key: "sourceid" Values: ["chrome"]
Key: "ie" Values: ["UTF-8"]
##################################################

URL: urn:oasis:names:description:docbook:dtd:xml:4.1.2
Scheme: urn
Opaque: oasis:names:description:docbook:dtd:xml:4.1.2
##################################################

URL: https://stackoverflow.com/jobs?med=site-ui&ref=jobs-tab
Scheme: https
Host: stackoverflow.com
Path: /jobs
RawQuery: med=site-ui&ref=jobs-tab
Key: "med" Values: ["site-ui"]
Key: "ref" Values: ["jobs-tab"]
##################################################

URL: ssh://mark@testing.com
Scheme: ssh
Username: mark
Host: testing.com
##################################################
Most Helpful This Week