Commit 99156f80 authored by Wescoeur's avatar Wescoeur

feat(ui/scripts/Utils/uri-tools): supports IP

parent 9cdef13b
// ============================================================================= // =============================================================================
// Library to deal with URI. // Library to deal with URI.
// See: https://tools.ietf.org/html/rfc3986#section-1.3
// ============================================================================= // =============================================================================
.pragma library .pragma library
...@@ -12,6 +13,15 @@ var SUPPORTS_URL = true ...@@ -12,6 +13,15 @@ var SUPPORTS_URL = true
// Level 0. -------------------------------------------------------------------- // Level 0. --------------------------------------------------------------------
var URI_DEC_OCTET = '(?:' +
'25[0-5]' +
'|' + '2[0-4]\\d' +
'|' + '1\\d{2}' +
'|' + '[1-9]\\d' +
'|' + '\\d' +
')'
var URI_H16 = '[0-9A-Fa-f]{1,4}'
var URI_PCT_ENCODED = '%[A-Fa-f\\d]{2}' var URI_PCT_ENCODED = '%[A-Fa-f\\d]{2}'
var URI_PORT = '\\d*' var URI_PORT = '\\d*'
var URI_SCHEME = '[a-zA-Z][\\w+\-\.]*' var URI_SCHEME = '[a-zA-Z][\\w+\-\.]*'
...@@ -20,14 +30,15 @@ var URI_UNRESERVED = '[\\w\-\._~]' ...@@ -20,14 +30,15 @@ var URI_UNRESERVED = '[\\w\-\._~]'
// Level 1. -------------------------------------------------------------------- // Level 1. --------------------------------------------------------------------
var URI_HOST = '(?:' + var URI_IPV_FUTURE = 'v[0-9A-Fa-f]+\\.' + '(?:' +
'(?:' +
URI_UNRESERVED + URI_UNRESERVED +
'|' + URI_PCT_ENCODED + URI_SUB_DELIMS +
'|' + URI_SUB_DELIMS + ':' +
')*' +
')' ')'
var URI_IPV4_ADDRESS = URI_DEC_OCTET + '\\.' + URI_DEC_OCTET + '\\.' +
URI_DEC_OCTET + '\\.' + URI_DEC_OCTET
var URI_PCHAR = '(?:' + var URI_PCHAR = '(?:' +
URI_UNRESERVED + URI_UNRESERVED +
'|' + URI_PCT_ENCODED + '|' + URI_PCT_ENCODED +
...@@ -35,6 +46,12 @@ var URI_PCHAR = '(?:' + ...@@ -35,6 +46,12 @@ var URI_PCHAR = '(?:' +
'|' + '[:@]' + '|' + '[:@]' +
')' ')'
var URI_REG_NAME = '(?:' +
URI_UNRESERVED +
'|' + URI_PCT_ENCODED +
'|' + URI_SUB_DELIMS +
')*'
var URI_USERINFO = '(?:' + var URI_USERINFO = '(?:' +
URI_UNRESERVED + URI_UNRESERVED +
'|' + URI_PCT_ENCODED + '|' + URI_PCT_ENCODED +
...@@ -44,15 +61,16 @@ var URI_USERINFO = '(?:' + ...@@ -44,15 +61,16 @@ var URI_USERINFO = '(?:' +
// Level 2. -------------------------------------------------------------------- // Level 2. --------------------------------------------------------------------
var URI_AUTHORITY = '(?:' + URI_USERINFO + '@' + ')?' +
URI_HOST +
'(?:' + ':' + URI_PORT + ')?'
var URI_FRAGMENT = '(?:' + var URI_FRAGMENT = '(?:' +
URI_PCHAR + URI_PCHAR +
'|' + '[/?]' + '|' + '[/?]' +
')*' ')*'
var URI_LS32 = '(?:' +
URI_H16 + ':' + URI_H16 +
'|' + URI_IPV4_ADDRESS +
')'
var URI_QUERY = '(?:' + var URI_QUERY = '(?:' +
URI_PCHAR + URI_PCHAR +
'|' + '[/?]' + '|' + '[/?]' +
...@@ -63,6 +81,18 @@ var URI_SEGMENT_NZ = URI_PCHAR + '+' ...@@ -63,6 +81,18 @@ var URI_SEGMENT_NZ = URI_PCHAR + '+'
// Level 3. -------------------------------------------------------------------- // Level 3. --------------------------------------------------------------------
var URI_IPV6_ADDRESS = '(?:' +
'(?:' + URI_H16 + ':){6}' + URI_LS32 +
'|' + '::(?:' + URI_H16 + ':){5}' + URI_LS32 +
'|' + '\\[' + URI_H16 + '\\]::(?:' + URI_H16 + ':){4}' + URI_LS32 +
'|' + '\\[' + '(?:' + URI_H16 + ':)?' + URI_H16 + '\\]::(?:' + URI_H16 + ':){3}' + URI_LS32 +
'|' + '\\[' + '(?:' + URI_H16 + ':){0,2}' + URI_H16 + '\\]::(?:' + URI_H16 + ':){2}' + URI_LS32 +
'|' + '\\[' + '(?:' + URI_H16 + ':){0,3}' + URI_H16 + '\\]::' + URI_H16 + ':' + URI_LS32 +
'|' + '\\[' + '(?:' + URI_H16 + ':){0,4}' + URI_H16 + '\\]::' + URI_LS32 +
'|' + '\\[' + '(?:' + URI_H16 + ':){0,5}' + URI_H16 + '\\]::' + URI_H16 +
'|' + '\\[' + '(?:' + URI_H16 + ':){0,6}' + URI_H16 + '\\]::' +
')'
var URI_PATH_ABEMPTY = '(?:' + '/' + URI_SEGMENT + ')*' var URI_PATH_ABEMPTY = '(?:' + '/' + URI_SEGMENT + ')*'
var URI_PATH_ABSOLUTE = '/' + var URI_PATH_ABSOLUTE = '/' +
...@@ -73,6 +103,29 @@ var URI_PATH_ROOTLESS = ...@@ -73,6 +103,29 @@ var URI_PATH_ROOTLESS =
// Level 4. -------------------------------------------------------------------- // Level 4. --------------------------------------------------------------------
var URI_IP_LITERAL = '\\[' +
'(?:' +
URI_IPV6_ADDRESS +
'|' + URI_IPV_FUTURE +
')' +
'\\]'
// Level 5. --------------------------------------------------------------------
var URI_HOST = '(?:' +
URI_REG_NAME +
'|' + URI_IPV4_ADDRESS +
'|' + URI_IP_LITERAL +
')'
// Level 6. --------------------------------------------------------------------
var URI_AUTHORITY = '(?:' + URI_USERINFO + '@' + ')?' +
URI_HOST +
'(?:' + ':' + URI_PORT + ')?'
// Level 7. --------------------------------------------------------------------
// `path-empty` not used. // `path-empty` not used.
var URI_HIER_PART = '(?:' + var URI_HIER_PART = '(?:' +
'//' + URI_AUTHORITY + URI_PATH_ABEMPTY + '//' + URI_AUTHORITY + URI_PATH_ABEMPTY +
...@@ -80,72 +133,13 @@ var URI_HIER_PART = '(?:' + ...@@ -80,72 +133,13 @@ var URI_HIER_PART = '(?:' +
'|' + URI_PATH_ROOTLESS + '|' + URI_PATH_ROOTLESS +
')' ')'
// Level 5. -------------------------------------------------------------------- // Level 8. --------------------------------------------------------------------
// Regex to match URI. It respects the RFC 3986. // Regex to match URI. It respects the RFC 3986.
// But many features are not supported like IP format.
var URI = (SUPPORTS_URL var URI = (SUPPORTS_URL
? '(?:' + URI_SCHEME + ':' + '|' + 'www\\.' + ')' ? '(?:' + URI_SCHEME + ':' + '|' + 'www\\.' + ')'
: URI_SCHEME + ':' : URI_SCHEME + ':'
) + URI_HIER_PART + '(?:' + '\\?' + URI_QUERY + ')?' + ) + URI_HIER_PART + '(?:' + '\\?' + URI_QUERY + ')?' +
'(?:' + '#' + URI_FRAGMENT + ')?' '(?:' + '#' + URI_FRAGMENT + ')?'
var URI_REGEX = new RegExp('(' + URI + ')', 'g') var URI_REGEX = new RegExp('(' + URI + ')', 'g')
// =============================================================================
/* TODO: Supports:
URI-reference = URI / relative-ref
absolute-URI = scheme ":" hier-part [ "?" query ]
relative-ref = relative-part [ "?" query ] [ "#" fragment ]
relative-part = "//" authority path-abempty
/ path-absolute
/ path-noscheme
/ path-empty
host = IP-literal / IPv4address / reg-name
IP-literal = "[" ( IPv6address / IPvFuture ) "]"
IPvFuture = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" )
IPv6address = 6( h16 ":" ) ls32
/ "::" 5( h16 ":" ) ls32
/ [ h16 ] "::" 4( h16 ":" ) ls32
/ [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
/ [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
/ [ *3( h16 ":" ) h16 ] "::" h16 ":" ls32
/ [ *4( h16 ":" ) h16 ] "::" ls32
/ [ *5( h16 ":" ) h16 ] "::" h16
/ [ *6( h16 ":" ) h16 ] "::"
h16 = 1*4HEXDIG
ls32 = ( h16 ":" h16 ) / IPv4address
IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet
dec-octet = DIGIT ; 0-9
/ %x31-39 DIGIT ; 10-99
/ "1" 2DIGIT ; 100-199
/ "2" %x30-34 DIGIT ; 200-249
/ "25" %x30-35 ; 250-255
reg-name = *( unreserved / pct-encoded / sub-delims )
path = path-abempty ; begins with "/" or is empty
/ path-absolute ; begins with "/" but not "//"
/ path-noscheme ; begins with a non-colon segment
/ path-rootless ; begins with a segment
/ path-empty ; zero characters
path-noscheme = segment-nz-nc *( "/" segment )
segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" )
; non-zero-length segment without any colon ":"
reserved = gen-delims / sub-delims
gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
*/
import QtTest 1.1 import QtTest 1.1
import './uri-tools.js' as UriTools import 'uri-tools.js' as UriTools
// ============================================================================= // =============================================================================
...@@ -23,6 +23,10 @@ TestCase { ...@@ -23,6 +23,10 @@ TestCase {
function test_matchUri_data () { function test_matchUri_data () {
return [ return [
// =======================================================================
// Must match.
// =======================================================================
{ {
input: 'http://www.LaRmInA.com/', input: 'http://www.LaRmInA.com/',
output: [ 'http://www.LaRmInA.com/' ] output: [ 'http://www.LaRmInA.com/' ]
...@@ -68,6 +72,42 @@ TestCase { ...@@ -68,6 +72,42 @@ TestCase {
}, { }, {
input: 'protocol://U$3r:p@sswd/WwW.L33t.sp3', input: 'protocol://U$3r:p@sswd/WwW.L33t.sp3',
output: [ 'protocol://U$3r:p@sswd/WwW.L33t.sp3' ] output: [ 'protocol://U$3r:p@sswd/WwW.L33t.sp3' ]
}, {
input: 'foo://username:password@www.example.com:123/hello/world/there.html?name=ferret#foo',
output: [ 'foo://username:password@www.example.com:123/hello/world/there.html?name=ferret#foo' ]
}, {
input: 'lalala://lololo.titi/tata_(tutu)#riri-0',
output: [ 'lalala://lololo.titi/tata_(tutu)#riri-0' ]
}, {
input: 'dest://007@uk.en:8080/',
output: [ 'dest://007@uk.en:8080/' ]
}, {
input: 'fefe://zef.sfdfzfds.vfs/zrefz/?vsfezzef=afzfefg&zfefezfze=7275&grgr',
output: [ 'fefe://zef.sfdfzfds.vfs/zrefz/?vsfezzef=afzfefg&zfefezfze=7275&grgr' ]
}, {
input: 'fefe://xcv.zefe/(fzfff)?zefezef=fzefzef',
output: [ 'fefe://xcv.zefe/(fzfff)?zefezef=fzefzef' ]
}, {
input: 'feeffsd://vccvx.zzef.dfs/xcvvcx/#&zfe=zfe',
output: [ 'feeffsd://vccvx.zzef.dfs/xcvvcx/#&zfe=zfe' ]
}, {
input: 'http://256.1.1.1',
output: [ 'http://256.1.1.1' ] // Valid URI. Invalid URL.
}, {
input: 'http://0.0.0.0',
output: [ 'http://0.0.0.0' ] // Same idea.
}, {
input: 'http://a.b--c.de/',
output: [ 'http://a.b--c.de/' ] // And again.
}, {
input: 'http://1.0.1.0.1.0',
output: [ 'http://1.0.1.0.1.0' ] // AND AGAIN.
}, {
input: 'http://abc.c.d.',
output: [ 'http://abc.c.d.' ] // AAAAND AAAGAAAIIIIIN.
}, {
input: 'https://a.b-c.de/',
output: [ 'https://a.b-c.de/' ]
}, { }, {
input: 'http://a/B/c?a&b&c', input: 'http://a/B/c?a&b&c',
output: [ 'http://a/B/c?a&b&c' ] output: [ 'http://a/B/c?a&b&c' ]
...@@ -75,6 +115,18 @@ TestCase { ...@@ -75,6 +115,18 @@ TestCase {
input: '1http://www.linphone.org', input: '1http://www.linphone.org',
output: [ 'http://www.linphone.org' ] output: [ 'http://www.linphone.org' ]
}, { }, {
input: 'http://255.254.255.254',
output: [ 'http://255.254.255.254' ]
}, {
input: 'http://12.42.1.10/',
output: [ 'http://12.42.1.10/' ]
},
// =======================================================================
// Partial or no match.
// =======================================================================
{
input: '://www.linphone.org', input: '://www.linphone.org',
output: UriTools.SUPPORTS_URL output: UriTools.SUPPORTS_URL
? [ 'www.linphone.org' ] ? [ 'www.linphone.org' ]
...@@ -85,6 +137,21 @@ TestCase { ...@@ -85,6 +137,21 @@ TestCase {
}, { }, {
input: '/path/', input: '/path/',
output: null output: null
}, {
input: 'http://✪dragooooonnnn✪ball✪z✪z✪z.goku/4',
output: [ 'http://' ]
}, {
input: 'http:// iamafail.fr',
output: [ 'http://' ]
}, {
input: 'isaac://石村.jp',
output: [ 'isaac://' ]
}, {
input: ':// not good',
output: null
}, {
input: 'http://☺.☺.☺',
output: [ 'http://' ]
} }
] ]
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment