Nginx in Tcl
proc nginx_http_rewrite {uri} {
do {
foreach rewrite_rule in $server_block {
if {"last" || "break"} break
if {"return"} { return -code break }
}
} while {0}
set rewrite_loop 0
do {
set location_block [nginx_match_location]
set rewritten 0
foreach rewrite_rule in $location_block {
# rewrite regexp replacement [flag]
if {"last"} break
if {"break"} return
if {"return"} { return -code break }
}
incr rewrite_loop
} while {$rewritten && $rewrite_loop<10}
return
}
Nginx - location
- longest prefix match
- return if it's exact match
- regexp match
proc nginx_match_location {uri} {
const location_type [enum "" "=" "~" "~*" "^~"]
set longest_match {}
# grep | sort | head
foreach location_block $prefix_locations {
lassign $location_block type prefix block
if [string match "$prefix*" $uri] {
if {$type eq "="} {
return $location_block
} else {
set longest_match [%longest $location_block [string length $prefix]]
}
}
}
if {[lindex $longest_match 0] eq "^~"} {
return $longest_match
}
foreach location_block $regexp_locations {
lassign $location_block type pattern block
switch -exact -- $type "~" {
set match [regexp $pattern $uri]
} "~*" {
set match [regexp -nocase $pattern $uri]
}
if {$match} {
return [list $type $pattern $match]
}
}
return $longest_match
}