|
@@ -306,6 +306,7 @@ module.exports = exports =
|
|
ip: null
|
|
ip: null
|
|
scheme: null
|
|
scheme: null
|
|
url: null
|
|
url: null
|
|
|
|
+ normalizedPattern: ''
|
|
server = condition.pattern
|
|
server = condition.pattern
|
|
if server == '<local>'
|
|
if server == '<local>'
|
|
cache.host = server
|
|
cache.host = server
|
|
@@ -313,6 +314,7 @@ module.exports = exports =
|
|
parts = server.split '://'
|
|
parts = server.split '://'
|
|
if parts.length > 1
|
|
if parts.length > 1
|
|
cache.scheme = parts[0]
|
|
cache.scheme = parts[0]
|
|
|
|
+ cache.normalizedPattern = cache.scheme + '://'
|
|
server = parts[1]
|
|
server = parts[1]
|
|
|
|
|
|
parts = server.split '/'
|
|
parts = server.split '/'
|
|
@@ -322,36 +324,43 @@ module.exports = exports =
|
|
if addr and not isNaN(prefixLen)
|
|
if addr and not isNaN(prefixLen)
|
|
cache.ip =
|
|
cache.ip =
|
|
conditionType: 'IpCondition'
|
|
conditionType: 'IpCondition'
|
|
- ip: parts[0]
|
|
|
|
|
|
+ ip: @normalizeIp addr
|
|
prefixLength: prefixLen
|
|
prefixLength: prefixLen
|
|
|
|
+ cache.normalizedPattern += cache.ip.ip + '/' + cache.ip.prefixLength
|
|
return cache
|
|
return cache
|
|
- if server.charCodeAt(server.length - 1) != ']'.charCodeAt(0)
|
|
|
|
|
|
+ # The server can be an IP address with or without brackets.
|
|
|
|
+ serverIp = @parseIp(server)
|
|
|
|
+ if not serverIp?
|
|
pos = server.lastIndexOf(':')
|
|
pos = server.lastIndexOf(':')
|
|
if pos >= 0
|
|
if pos >= 0
|
|
matchPort = server.substring(pos + 1)
|
|
matchPort = server.substring(pos + 1)
|
|
server = server.substring(0, pos)
|
|
server = server.substring(0, pos)
|
|
- serverIp = @parseIp server
|
|
|
|
- serverRegex = null
|
|
|
|
|
|
+ serverIp = @parseIp server
|
|
if serverIp?
|
|
if serverIp?
|
|
- if serverIp.regularExpressionString?
|
|
|
|
- regexStr = serverIp.regularExpressionString(true)
|
|
|
|
- serverRegex = '\\[' + regexStr + '\\]'
|
|
|
|
|
|
+ server = @normalizeIp serverIp
|
|
|
|
+ if serverIp.v4
|
|
|
|
+ cache.normalizedPattern += server
|
|
else
|
|
else
|
|
- server = @normalizeIp serverIp
|
|
|
|
- else if server.charCodeAt(0) == '.'.charCodeAt(0)
|
|
|
|
- server = '*' + server
|
|
|
|
|
|
+ cache.normalizedPattern += '[' + server + ']'
|
|
|
|
+ else
|
|
|
|
+ if server.charCodeAt(0) == '.'.charCodeAt(0)
|
|
|
|
+ server = '*' + server
|
|
|
|
+ cache.normalizedPattern = server
|
|
|
|
+
|
|
if matchPort
|
|
if matchPort
|
|
- if not serverRegex?
|
|
|
|
- serverRegex = shExp2RegExp(server)
|
|
|
|
- serverRegex = serverRegex.substring(1, serverRegex.length - 1)
|
|
|
|
|
|
+ cache.port = matchPort
|
|
|
|
+ cache.normalizedPattern += ':' + cache.port
|
|
|
|
+ # In URL, IPv6 server addresses need to be bracketed.
|
|
|
|
+ if serverIp? and not serverIp.v4
|
|
|
|
+ server = '[' + server + ']'
|
|
|
|
+ serverRegex = shExp2RegExp(server)
|
|
|
|
+ serverRegex = serverRegex.substring(1, serverRegex.length - 1)
|
|
scheme = cache.scheme ? '[^:]+'
|
|
scheme = cache.scheme ? '[^:]+'
|
|
cache.url = @safeRegex('^' + scheme + ':\\/\\/' + serverRegex +
|
|
cache.url = @safeRegex('^' + scheme + ':\\/\\/' + serverRegex +
|
|
':' + matchPort + '\\/')
|
|
':' + matchPort + '\\/')
|
|
else if server != '*'
|
|
else if server != '*'
|
|
- if serverRegex
|
|
|
|
- serverRegex = '^' + serverRegex + '$'
|
|
|
|
- else
|
|
|
|
- serverRegex = shExp2RegExp server, trimAsterisk: true
|
|
|
|
|
|
+ # In host, IPv6 server addresses are never bracketed.
|
|
|
|
+ serverRegex = shExp2RegExp server, trimAsterisk: true
|
|
cache.host = @safeRegex(serverRegex)
|
|
cache.host = @safeRegex(serverRegex)
|
|
return cache
|
|
return cache
|
|
match: (condition, request, cache) ->
|
|
match: (condition, request, cache) ->
|
|
@@ -374,6 +383,13 @@ module.exports = exports =
|
|
return false if not cache.host.test(request.host)
|
|
return false if not cache.host.test(request.host)
|
|
return false if cache.url? and !cache.url.test(request.url)
|
|
return false if cache.url? and !cache.url.test(request.url)
|
|
return true
|
|
return true
|
|
|
|
+ str: (condition) ->
|
|
|
|
+ analyze = @_handler(condition).analyze
|
|
|
|
+ cache = analyze.call(exports, condition)
|
|
|
|
+ if cache.normalizedPattern
|
|
|
|
+ return cache.normalizedPattern
|
|
|
|
+ else
|
|
|
|
+ return condition.pattern
|
|
compile: (condition, cache) ->
|
|
compile: (condition, cache) ->
|
|
cache = cache.analyzed
|
|
cache = cache.analyzed
|
|
if cache.url?
|
|
if cache.url?
|