A user account is required in order to edit this wiki, but we've had to disable public user registrations due to spam.
To request an account, ask an autoconfirmed user on Chat (such as one of these permanent autoconfirmed members).
URL
Jump to navigation
Jump to search
This documents research and notes around the URL specification.
Implementations
- http://trac.webkit.org/browser/trunk/Source/WebCore/platform/KURL.cpp
- http://trac.webkit.org/browser/trunk/Source/WebCore/platform/KURLWTFURL.cpp
- http://trac.webkit.org/browser/trunk/Source/WebCore/platform/KURLGoogle.cpp
- http://trac.webkit.org/browser/trunk/Source/WebCore/platform/network/DataURL.cpp (data URLs)
Tests
Model
URL (.href) - invalid? - scheme (.protocol) - authority - username (proposed .username) - password (proposed .password) - ip/host (.hostname) - port (.port) - path (.pathname) - query (.search) - fragment (.hash)
Parsing
parse (urlstr, optional baseURL) url = new URL tokenize(urlstr) SCHEME CHECK START if char is in ALPHA buffer += char -> SCHEME CHECK NEXT else unconsume char -> NO SCHEME SCHEME CHECK NEXT if char is in ALPHA / DIGIT / "+" / "-" / "." buffer += char -> continue elif char is ":" url.scheme = buffer.toASCIILowercase() buffer = "" -> SCHEME else: input.reset() -> NO SCHEME SCHEME if url.scheme is not hierarchical (data:) -> NON-HIERARCHICAL elif baseURL and url.scheme is baseURL.scheme (http:?test) -> RELATIVE else (https://test.com/) -> AUTHORITY START NO SCHEME if not baseURL or baseURL.scheme is not hierarchical url.invalid = true return url else -> RELATIVE NON-HIERARCHICAL (could merge with PATH) if curChar is "#" FRAGMENT else ... RELATIVE if char is EOI (end-of-input) url = baseURL url.fragment = null exit elif char is "/" or char is "\" if next char "/" or next char is "\" url.scheme = baseURL.scheme -> AUTHORITY START else url.scheme = baseURL.scheme url.authority = baseURL.authority -> PATH elif char is "?" url.scheme = baseURL.scheme url.authority = baseURL.authority url.path = baseURL.path -> QUERY elif char is "#" url.scheme = baseURL.scheme url.authority = baseURL.authority url.path = baseURL.path url.query = baseURL.query -> FRAGMENT else url.scheme = baseURL.scheme url.authority = baseURL.authority prepend input by baseURL.path up to the last / -> PATH AUTHORITY START if char is "/" or char is "\" -> continue else -> AUTHORITY AUTHORITY ... PATH if char is "?" -> QUERY if char is "#" -> FRAGMENT else buffer += char QUERY if char is "#" -> FRAGMENT FRAGMENT ...