[79a0317] | 1 | 'use strict'
|
---|
| 2 |
|
---|
| 3 | const test = require('tape')
|
---|
| 4 | const URI = require('../')
|
---|
| 5 |
|
---|
| 6 | test('URI parse', (t) => {
|
---|
| 7 | let components
|
---|
| 8 |
|
---|
| 9 | // scheme
|
---|
| 10 | components = URI.parse('uri:')
|
---|
| 11 | t.equal(components.error, undefined, 'scheme errors')
|
---|
| 12 | t.equal(components.scheme, 'uri', 'scheme')
|
---|
| 13 | // t.equal(components.authority, undefined, "authority");
|
---|
| 14 | t.equal(components.userinfo, undefined, 'userinfo')
|
---|
| 15 | t.equal(components.host, undefined, 'host')
|
---|
| 16 | t.equal(components.port, undefined, 'port')
|
---|
| 17 | t.equal(components.path, '', 'path')
|
---|
| 18 | t.equal(components.query, undefined, 'query')
|
---|
| 19 | t.equal(components.fragment, undefined, 'fragment')
|
---|
| 20 |
|
---|
| 21 | // userinfo
|
---|
| 22 | components = URI.parse('//@')
|
---|
| 23 | t.equal(components.error, undefined, 'userinfo errors')
|
---|
| 24 | t.equal(components.scheme, undefined, 'scheme')
|
---|
| 25 | // t.equal(components.authority, "@", "authority");
|
---|
| 26 | t.equal(components.userinfo, '', 'userinfo')
|
---|
| 27 | t.equal(components.host, '', 'host')
|
---|
| 28 | t.equal(components.port, undefined, 'port')
|
---|
| 29 | t.equal(components.path, '', 'path')
|
---|
| 30 | t.equal(components.query, undefined, 'query')
|
---|
| 31 | t.equal(components.fragment, undefined, 'fragment')
|
---|
| 32 |
|
---|
| 33 | // host
|
---|
| 34 | components = URI.parse('//')
|
---|
| 35 | t.equal(components.error, undefined, 'host errors')
|
---|
| 36 | t.equal(components.scheme, undefined, 'scheme')
|
---|
| 37 | // t.equal(components.authority, "", "authority");
|
---|
| 38 | t.equal(components.userinfo, undefined, 'userinfo')
|
---|
| 39 | t.equal(components.host, '', 'host')
|
---|
| 40 | t.equal(components.port, undefined, 'port')
|
---|
| 41 | t.equal(components.path, '', 'path')
|
---|
| 42 | t.equal(components.query, undefined, 'query')
|
---|
| 43 | t.equal(components.fragment, undefined, 'fragment')
|
---|
| 44 |
|
---|
| 45 | // port
|
---|
| 46 | components = URI.parse('//:')
|
---|
| 47 | t.equal(components.error, undefined, 'port errors')
|
---|
| 48 | t.equal(components.scheme, undefined, 'scheme')
|
---|
| 49 | // t.equal(components.authority, ":", "authority");
|
---|
| 50 | t.equal(components.userinfo, undefined, 'userinfo')
|
---|
| 51 | t.equal(components.host, '', 'host')
|
---|
| 52 | t.equal(components.port, '', 'port')
|
---|
| 53 | t.equal(components.path, '', 'path')
|
---|
| 54 | t.equal(components.query, undefined, 'query')
|
---|
| 55 | t.equal(components.fragment, undefined, 'fragment')
|
---|
| 56 |
|
---|
| 57 | // path
|
---|
| 58 | components = URI.parse('')
|
---|
| 59 | t.equal(components.error, undefined, 'path errors')
|
---|
| 60 | t.equal(components.scheme, undefined, 'scheme')
|
---|
| 61 | // t.equal(components.authority, undefined, "authority");
|
---|
| 62 | t.equal(components.userinfo, undefined, 'userinfo')
|
---|
| 63 | t.equal(components.host, undefined, 'host')
|
---|
| 64 | t.equal(components.port, undefined, 'port')
|
---|
| 65 | t.equal(components.path, '', 'path')
|
---|
| 66 | t.equal(components.query, undefined, 'query')
|
---|
| 67 | t.equal(components.fragment, undefined, 'fragment')
|
---|
| 68 |
|
---|
| 69 | // query
|
---|
| 70 | components = URI.parse('?')
|
---|
| 71 | t.equal(components.error, undefined, 'query errors')
|
---|
| 72 | t.equal(components.scheme, undefined, 'scheme')
|
---|
| 73 | // t.equal(components.authority, undefined, "authority");
|
---|
| 74 | t.equal(components.userinfo, undefined, 'userinfo')
|
---|
| 75 | t.equal(components.host, undefined, 'host')
|
---|
| 76 | t.equal(components.port, undefined, 'port')
|
---|
| 77 | t.equal(components.path, '', 'path')
|
---|
| 78 | t.equal(components.query, '', 'query')
|
---|
| 79 | t.equal(components.fragment, undefined, 'fragment')
|
---|
| 80 |
|
---|
| 81 | // fragment
|
---|
| 82 | components = URI.parse('#')
|
---|
| 83 | t.equal(components.error, undefined, 'fragment errors')
|
---|
| 84 | t.equal(components.scheme, undefined, 'scheme')
|
---|
| 85 | // t.equal(components.authority, undefined, "authority");
|
---|
| 86 | t.equal(components.userinfo, undefined, 'userinfo')
|
---|
| 87 | t.equal(components.host, undefined, 'host')
|
---|
| 88 | t.equal(components.port, undefined, 'port')
|
---|
| 89 | t.equal(components.path, '', 'path')
|
---|
| 90 | t.equal(components.query, undefined, 'query')
|
---|
| 91 | t.equal(components.fragment, '', 'fragment')
|
---|
| 92 |
|
---|
| 93 | // fragment with character tabulation
|
---|
| 94 | components = URI.parse('#\t')
|
---|
| 95 | t.equal(components.error, undefined, 'path errors')
|
---|
| 96 | t.equal(components.scheme, undefined, 'scheme')
|
---|
| 97 | // t.equal(components.authority, undefined, "authority");
|
---|
| 98 | t.equal(components.userinfo, undefined, 'userinfo')
|
---|
| 99 | t.equal(components.host, undefined, 'host')
|
---|
| 100 | t.equal(components.port, undefined, 'port')
|
---|
| 101 | t.equal(components.path, '', 'path')
|
---|
| 102 | t.equal(components.query, undefined, 'query')
|
---|
| 103 | t.equal(components.fragment, '%09', 'fragment')
|
---|
| 104 |
|
---|
| 105 | // fragment with line feed
|
---|
| 106 | components = URI.parse('#\n')
|
---|
| 107 | t.equal(components.error, undefined, 'path errors')
|
---|
| 108 | t.equal(components.scheme, undefined, 'scheme')
|
---|
| 109 | // t.equal(components.authority, undefined, "authority");
|
---|
| 110 | t.equal(components.userinfo, undefined, 'userinfo')
|
---|
| 111 | t.equal(components.host, undefined, 'host')
|
---|
| 112 | t.equal(components.port, undefined, 'port')
|
---|
| 113 | t.equal(components.path, '', 'path')
|
---|
| 114 | t.equal(components.query, undefined, 'query')
|
---|
| 115 | t.equal(components.fragment, '%0A', 'fragment')
|
---|
| 116 |
|
---|
| 117 | // fragment with line tabulation
|
---|
| 118 | components = URI.parse('#\v')
|
---|
| 119 | t.equal(components.error, undefined, 'path errors')
|
---|
| 120 | t.equal(components.scheme, undefined, 'scheme')
|
---|
| 121 | // t.equal(components.authority, undefined, "authority");
|
---|
| 122 | t.equal(components.userinfo, undefined, 'userinfo')
|
---|
| 123 | t.equal(components.host, undefined, 'host')
|
---|
| 124 | t.equal(components.port, undefined, 'port')
|
---|
| 125 | t.equal(components.path, '', 'path')
|
---|
| 126 | t.equal(components.query, undefined, 'query')
|
---|
| 127 | t.equal(components.fragment, '%0B', 'fragment')
|
---|
| 128 |
|
---|
| 129 | // fragment with form feed
|
---|
| 130 | components = URI.parse('#\f')
|
---|
| 131 | t.equal(components.error, undefined, 'path errors')
|
---|
| 132 | t.equal(components.scheme, undefined, 'scheme')
|
---|
| 133 | // t.equal(components.authority, undefined, "authority");
|
---|
| 134 | t.equal(components.userinfo, undefined, 'userinfo')
|
---|
| 135 | t.equal(components.host, undefined, 'host')
|
---|
| 136 | t.equal(components.port, undefined, 'port')
|
---|
| 137 | t.equal(components.path, '', 'path')
|
---|
| 138 | t.equal(components.query, undefined, 'query')
|
---|
| 139 | t.equal(components.fragment, '%0C', 'fragment')
|
---|
| 140 |
|
---|
| 141 | // fragment with carriage return
|
---|
| 142 | components = URI.parse('#\r')
|
---|
| 143 | t.equal(components.error, undefined, 'path errors')
|
---|
| 144 | t.equal(components.scheme, undefined, 'scheme')
|
---|
| 145 | // t.equal(components.authority, undefined, "authority");
|
---|
| 146 | t.equal(components.userinfo, undefined, 'userinfo')
|
---|
| 147 | t.equal(components.host, undefined, 'host')
|
---|
| 148 | t.equal(components.port, undefined, 'port')
|
---|
| 149 | t.equal(components.path, '', 'path')
|
---|
| 150 | t.equal(components.query, undefined, 'query')
|
---|
| 151 | t.equal(components.fragment, '%0D', 'fragment')
|
---|
| 152 |
|
---|
| 153 | // all
|
---|
| 154 | components = URI.parse('uri://user:pass@example.com:123/one/two.three?q1=a1&q2=a2#body')
|
---|
| 155 | t.equal(components.error, undefined, 'all errors')
|
---|
| 156 | t.equal(components.scheme, 'uri', 'scheme')
|
---|
| 157 | // t.equal(components.authority, "user:pass@example.com:123", "authority");
|
---|
| 158 | t.equal(components.userinfo, 'user:pass', 'userinfo')
|
---|
| 159 | t.equal(components.host, 'example.com', 'host')
|
---|
| 160 | t.equal(components.port, 123, 'port')
|
---|
| 161 | t.equal(components.path, '/one/two.three', 'path')
|
---|
| 162 | t.equal(components.query, 'q1=a1&q2=a2', 'query')
|
---|
| 163 | t.equal(components.fragment, 'body', 'fragment')
|
---|
| 164 |
|
---|
| 165 | // IPv4address
|
---|
| 166 | components = URI.parse('//10.10.10.10')
|
---|
| 167 | t.equal(components.error, undefined, 'IPv4address errors')
|
---|
| 168 | t.equal(components.scheme, undefined, 'scheme')
|
---|
| 169 | t.equal(components.userinfo, undefined, 'userinfo')
|
---|
| 170 | t.equal(components.host, '10.10.10.10', 'host')
|
---|
| 171 | t.equal(components.port, undefined, 'port')
|
---|
| 172 | t.equal(components.path, '', 'path')
|
---|
| 173 | t.equal(components.query, undefined, 'query')
|
---|
| 174 | t.equal(components.fragment, undefined, 'fragment')
|
---|
| 175 |
|
---|
| 176 | // IPv4address with unformated 0 stay as-is
|
---|
| 177 | components = URI.parse('//10.10.000.10') // not valid as per https://datatracker.ietf.org/doc/html/rfc5954#section-4.1
|
---|
| 178 | t.equal(components.error, undefined, 'IPv4address errors')
|
---|
| 179 | t.equal(components.scheme, undefined, 'scheme')
|
---|
| 180 | t.equal(components.userinfo, undefined, 'userinfo')
|
---|
| 181 | t.equal(components.host, '10.10.000.10', 'host')
|
---|
| 182 | t.equal(components.port, undefined, 'port')
|
---|
| 183 | t.equal(components.path, '', 'path')
|
---|
| 184 | t.equal(components.query, undefined, 'query')
|
---|
| 185 | t.equal(components.fragment, undefined, 'fragment')
|
---|
| 186 | components = URI.parse('//01.01.01.01') // not valid in URIs: https://datatracker.ietf.org/doc/html/rfc3986#section-7.4
|
---|
| 187 | t.equal(components.error, undefined, 'IPv4address errors')
|
---|
| 188 | t.equal(components.scheme, undefined, 'scheme')
|
---|
| 189 | t.equal(components.userinfo, undefined, 'userinfo')
|
---|
| 190 | t.equal(components.host, '01.01.01.01', 'host')
|
---|
| 191 | t.equal(components.port, undefined, 'port')
|
---|
| 192 | t.equal(components.path, '', 'path')
|
---|
| 193 | t.equal(components.query, undefined, 'query')
|
---|
| 194 | t.equal(components.fragment, undefined, 'fragment')
|
---|
| 195 |
|
---|
| 196 | // IPv6address
|
---|
| 197 | components = URI.parse('//[2001:db8::7]')
|
---|
| 198 | t.equal(components.error, undefined, 'IPv4address errors')
|
---|
| 199 | t.equal(components.scheme, undefined, 'scheme')
|
---|
| 200 | t.equal(components.userinfo, undefined, 'userinfo')
|
---|
| 201 | t.equal(components.host, '2001:db8::7', 'host')
|
---|
| 202 | t.equal(components.port, undefined, 'port')
|
---|
| 203 | t.equal(components.path, '', 'path')
|
---|
| 204 | t.equal(components.query, undefined, 'query')
|
---|
| 205 | t.equal(components.fragment, undefined, 'fragment')
|
---|
| 206 |
|
---|
| 207 | // invalid IPv6
|
---|
| 208 | components = URI.parse('//[2001:dbZ::7]')
|
---|
| 209 | t.equal(components.host, '[2001:dbz::7]')
|
---|
| 210 |
|
---|
| 211 | // mixed IPv4address & IPv6address
|
---|
| 212 | components = URI.parse('//[::ffff:129.144.52.38]')
|
---|
| 213 | t.equal(components.error, undefined, 'IPv4address errors')
|
---|
| 214 | t.equal(components.scheme, undefined, 'scheme')
|
---|
| 215 | t.equal(components.userinfo, undefined, 'userinfo')
|
---|
| 216 | t.equal(components.host, '::ffff:129.144.52.38', 'host')
|
---|
| 217 | t.equal(components.port, undefined, 'port')
|
---|
| 218 | t.equal(components.path, '', 'path')
|
---|
| 219 | t.equal(components.query, undefined, 'query')
|
---|
| 220 | t.equal(components.fragment, undefined, 'fragment')
|
---|
| 221 |
|
---|
| 222 | // mixed IPv4address & reg-name, example from terion-name (https://github.com/garycourt/uri-js/issues/4)
|
---|
| 223 | components = URI.parse('uri://10.10.10.10.example.com/en/process')
|
---|
| 224 | t.equal(components.error, undefined, 'mixed errors')
|
---|
| 225 | t.equal(components.scheme, 'uri', 'scheme')
|
---|
| 226 | t.equal(components.userinfo, undefined, 'userinfo')
|
---|
| 227 | t.equal(components.host, '10.10.10.10.example.com', 'host')
|
---|
| 228 | t.equal(components.port, undefined, 'port')
|
---|
| 229 | t.equal(components.path, '/en/process', 'path')
|
---|
| 230 | t.equal(components.query, undefined, 'query')
|
---|
| 231 | t.equal(components.fragment, undefined, 'fragment')
|
---|
| 232 |
|
---|
| 233 | // IPv6address, example from bkw (https://github.com/garycourt/uri-js/pull/16)
|
---|
| 234 | components = URI.parse('//[2606:2800:220:1:248:1893:25c8:1946]/test')
|
---|
| 235 | t.equal(components.error, undefined, 'IPv6address errors')
|
---|
| 236 | t.equal(components.scheme, undefined, 'scheme')
|
---|
| 237 | t.equal(components.userinfo, undefined, 'userinfo')
|
---|
| 238 | t.equal(components.host, '2606:2800:220:1:248:1893:25c8:1946', 'host')
|
---|
| 239 | t.equal(components.port, undefined, 'port')
|
---|
| 240 | t.equal(components.path, '/test', 'path')
|
---|
| 241 | t.equal(components.query, undefined, 'query')
|
---|
| 242 | t.equal(components.fragment, undefined, 'fragment')
|
---|
| 243 |
|
---|
| 244 | // IPv6address, example from RFC 5952
|
---|
| 245 | components = URI.parse('//[2001:db8::1]:80')
|
---|
| 246 | t.equal(components.error, undefined, 'IPv6address errors')
|
---|
| 247 | t.equal(components.scheme, undefined, 'scheme')
|
---|
| 248 | t.equal(components.userinfo, undefined, 'userinfo')
|
---|
| 249 | t.equal(components.host, '2001:db8::1', 'host')
|
---|
| 250 | t.equal(components.port, 80, 'port')
|
---|
| 251 | t.equal(components.path, '', 'path')
|
---|
| 252 | t.equal(components.query, undefined, 'query')
|
---|
| 253 | t.equal(components.fragment, undefined, 'fragment')
|
---|
| 254 |
|
---|
| 255 | // IPv6address with zone identifier, RFC 6874
|
---|
| 256 | components = URI.parse('//[fe80::a%25en1]')
|
---|
| 257 | t.equal(components.error, undefined, 'IPv4address errors')
|
---|
| 258 | t.equal(components.scheme, undefined, 'scheme')
|
---|
| 259 | t.equal(components.userinfo, undefined, 'userinfo')
|
---|
| 260 | t.equal(components.host, 'fe80::a%en1', 'host')
|
---|
| 261 | t.equal(components.port, undefined, 'port')
|
---|
| 262 | t.equal(components.path, '', 'path')
|
---|
| 263 | t.equal(components.query, undefined, 'query')
|
---|
| 264 | t.equal(components.fragment, undefined, 'fragment')
|
---|
| 265 |
|
---|
| 266 | // IPv6address with an unescaped interface specifier, example from pekkanikander (https://github.com/garycourt/uri-js/pull/22)
|
---|
| 267 | components = URI.parse('//[2001:db8::7%en0]')
|
---|
| 268 | t.equal(components.error, undefined, 'IPv6address interface errors')
|
---|
| 269 | t.equal(components.scheme, undefined, 'scheme')
|
---|
| 270 | t.equal(components.userinfo, undefined, 'userinfo')
|
---|
| 271 | t.equal(components.host, '2001:db8::7%en0', 'host')
|
---|
| 272 | t.equal(components.port, undefined, 'port')
|
---|
| 273 | t.equal(components.path, '', 'path')
|
---|
| 274 | t.equal(components.query, undefined, 'query')
|
---|
| 275 | t.equal(components.fragment, undefined, 'fragment')
|
---|
| 276 |
|
---|
| 277 | // UUID V1
|
---|
| 278 | components = URI.parse('urn:uuid:b571b0bc-4713-11ec-81d3-0242ac130003')
|
---|
| 279 | t.equal(components.error, undefined, 'errors')
|
---|
| 280 | t.equal(components.scheme, 'urn', 'scheme')
|
---|
| 281 | // t.equal(components.authority, undefined, "authority");
|
---|
| 282 | t.equal(components.userinfo, undefined, 'userinfo')
|
---|
| 283 | t.equal(components.host, undefined, 'host')
|
---|
| 284 | t.equal(components.port, undefined, 'port')
|
---|
| 285 | t.equal(components.path, undefined, 'path')
|
---|
| 286 | t.equal(components.query, undefined, 'query')
|
---|
| 287 | t.equal(components.fragment, undefined, 'fragment')
|
---|
| 288 | t.equal(components.nid, 'uuid', 'nid')
|
---|
| 289 | t.equal(components.nss, undefined, 'nss')
|
---|
| 290 | t.equal(components.uuid, 'b571b0bc-4713-11ec-81d3-0242ac130003', 'uuid')
|
---|
| 291 |
|
---|
| 292 | // UUID v4
|
---|
| 293 | components = URI.parse('urn:uuid:97a32222-89b7-420e-8507-4360723e2c2a')
|
---|
| 294 | t.equal(components.uuid, '97a32222-89b7-420e-8507-4360723e2c2a', 'uuid')
|
---|
| 295 |
|
---|
| 296 | components = URI.parse('urn:uuid:notauuid-7dec-11d0-a765-00a0c91e6bf6')
|
---|
| 297 | t.notSame(components.error, undefined, 'errors')
|
---|
| 298 |
|
---|
| 299 | components = URI.parse('urn:foo:a123,456')
|
---|
| 300 | t.equal(components.error, undefined, 'errors')
|
---|
| 301 | t.equal(components.scheme, 'urn', 'scheme')
|
---|
| 302 | // t.equal(components.authority, undefined, "authority");
|
---|
| 303 | t.equal(components.userinfo, undefined, 'userinfo')
|
---|
| 304 | t.equal(components.host, undefined, 'host')
|
---|
| 305 | t.equal(components.port, undefined, 'port')
|
---|
| 306 | t.equal(components.path, undefined, 'path')
|
---|
| 307 | t.equal(components.query, undefined, 'query')
|
---|
| 308 | t.equal(components.fragment, undefined, 'fragment')
|
---|
| 309 | t.equal(components.nid, 'foo', 'nid')
|
---|
| 310 | t.equal(components.nss, 'a123,456', 'nss')
|
---|
| 311 |
|
---|
| 312 | components = URI.parse('//[2606:2800:220:1:248:1893:25c8:1946:43209]')
|
---|
| 313 | t.equal(components.host, '[2606:2800:220:1:248:1893:25c8:1946:43209]')
|
---|
| 314 |
|
---|
| 315 | components = URI.parse('urn:foo:|\\24fpl')
|
---|
| 316 | t.equal(components.error, 'URN can not be parsed.')
|
---|
| 317 | t.end()
|
---|
| 318 | })
|
---|