Task: URL parser




Go: package main

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

func main() {
	for _, in := range []string{
		"foo:
		"urn:example:animal:ferret:nose",
		"jdbc:mysql:
		"ftp:
		"http:
		"ldap:
		"mailto:John.Doe@example.com",
		"news:comp.infosystems.www.servers.unix",
		"tel:+1-816-555-1212",
		"telnet:
		"urn:oasis:names:specification:docbook:dtd:xml:4.1.2",

		"ssh:
		"https:
		"http:
	} {
		fmt.Println(in)
		u, err := url.Parse(in)
		if err != nil {
			log.Println(err)
			continue
		}
		if in != u.String() {
			fmt.Printf("Note: reassmebles as %q\n", u)
		}
		printURL(u)
	}
}

func printURL(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)
	}
}





VB: Function parse_url(url)
	parse_url = "URL: " & url
	If InStr(url,"//") Then
		
		scheme = Split(url,"//")
		parse_url = parse_url & vbcrlf & "Scheme: " & Mid(scheme(0),1,Len(scheme(0))-1)
		
		domain = Split(scheme(1),"/")
		
		If InStr(domain(0),"@") Then
			cred = Split(domain(0),"@")
			If InStr(cred(0),".") Then
				username = Mid(cred(0),1,InStr(1,cred(0),".")-1)
				password = Mid(cred(0),InStr(1,cred(0),".")+1,Len(cred(0))-InStr(1,cred(0),"."))
			ElseIf InStr(cred(0),":") Then
				username = Mid(cred(0),1,InStr(1,cred(0),":")-1)
				password = Mid(cred(0),InStr(1,cred(0),":")+1,Len(cred(0))-InStr(1,cred(0),":"))
			End If
			parse_url = parse_url & vbcrlf & "Username: " & username & vbCrLf &_
				"Password: " & password
			
			If InStr(cred(1),":") Then
				host = Mid(cred(1),1,InStr(1,cred(1),":")-1)
				port = Mid(cred(1),InStr(1,cred(1),":")+1,Len(cred(1))-InStr(1,cred(1),":"))
				parse_url = parse_url & vbCrLf & "Domain: " & host & vbCrLf & "Port: " & port 
			Else
				parse_url = parse_url & vbCrLf & "Domain: " & cred(1)
			End If
		ElseIf InStr(domain(0),":") And Instr(domain(0),"[") = False And Instr(domain(0),"]") = False Then
				host = Mid(domain(0),1,InStr(1,domain(0),":")-1)
				port = Mid(domain(0),InStr(1,domain(0),":")+1,Len(domain(0))-InStr(1,domain(0),":"))
				parse_url = parse_url & vbCrLf & "Domain: " & host & vbCrLf & "Port: " & port 
		ElseIf Instr(domain(0),"[") And Instr(domain(0),"]:") Then
			host = Mid(domain(0),1,InStr(1,domain(0),"]"))
			port = Mid(domain(0),InStr(1,domain(0),"]")+2,Len(domain(0))-(InStr(1,domain(0),"]")+1))
			parse_url = parse_url & vbCrLf & "Domain: " & host & vbCrLf & "Port: " & port 
		Else
			parse_url = parse_url & vbCrLf & "Domain: " & domain(0)
		End If
		
		If UBound(domain) > 0 Then
			For i = 1 To UBound(domain)
				If i < UBound(domain) Then
					path = path & domain(i) & "/"
				ElseIf InStr(domain(i),"?") Then
					path = path & Mid(domain(i),1,InStr(1,domain(i),"?")-1)
					If InStr(domain(i),"#") Then
						query = Mid(domain(i),InStr(1,domain(i),"?")+1,InStr(1,domain(i),"#")-InStr(1,domain(i),"?")-1)
						fragment = Mid(domain(i),InStr(1,domain(i),"#")+1,Len(domain(i))-InStr(1,domain(i),"#"))
						path = path & vbcrlf & "Query: " & query & vbCrLf & "Fragment: " & fragment
					Else
						query = Mid(domain(i),InStr(1,domain(i),"?")+1,Len(domain(i))-InStr(1,domain(i),"?"))
						path = path & vbcrlf & "Query: " & query
					End If
				ElseIf InStr(domain(i),"#") Then
					fragment = Mid(domain(i),InStr(1,domain(i),"#")+1,Len(domain(i))-InStr(1,domain(i),"#"))
					path = path & Mid(domain(i),1,InStr(1,domain(i),"#")-1) & vbCrLf &_
						 "Fragment: " & fragment
				Else
					path = path & domain(i)
				End If
			Next
			parse_url = parse_url & vbCrLf & "Path: " & path 
		End If
	ElseIf InStr(url,":") Then
		scheme = Mid(url,1,InStr(1,url,":")-1)
		path = Mid(url,InStr(1,url,":")+1,Len(url)-InStr(1,url,":"))
		parse_url = parse_url & vbcrlf & "Scheme: " & scheme & vbCrLf & "Path: " & path
	Else
		parse_url = parse_url & vbcrlf & "Invalid!!!"
	End If

End Function


WScript.StdOut.WriteLine parse_url("foo://example.com:8042/over/there?name=ferret#nose")
WScript.StdOut.WriteLine "-------------------------------"
WScript.StdOut.WriteLine parse_url("jdbc:mysql://test_user:ouupppssss@localhost:3306/sakila?profileSQL=true")
WScript.StdOut.WriteLine "-------------------------------"
WScript.StdOut.WriteLine parse_url("ftp://ftp.is.co.za/rfc/rfc1808.txt")
WScript.StdOut.WriteLine "-------------------------------"
WScript.StdOut.WriteLine parse_url("http://www.ietf.org/rfc/rfc2396.txt#header1")
WScript.StdOut.WriteLine "-------------------------------"
WScript.StdOut.WriteLine parse_url("ldap://[2001:db8::7]/c=GB?objectClass=one&objectClass=two")
WScript.StdOut.WriteLine "-------------------------------"
WScript.StdOut.WriteLine parse_url("mailto:John.Doe@example.com")
WScript.StdOut.WriteLine "-------------------------------"
WScript.StdOut.WriteLine parse_url("news:comp.infosystems.www.servers.unix")
WScript.StdOut.WriteLine "-------------------------------"
WScript.StdOut.WriteLine parse_url("tel:+1-816-555-1212")
WScript.StdOut.WriteLine "-------------------------------"
WScript.StdOut.WriteLine parse_url("telnet://192.0.2.16:80/")
WScript.StdOut.WriteLine "-------------------------------"
WScript.StdOut.WriteLine parse_url("urn:oasis:names:specification:docbook:dtd:xml:4.1.2")
WScript.StdOut.WriteLine "-------------------------------"
WScript.StdOut.WriteLine parse_url("this code is messy, long, and needs a makeover!!!")