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

  1. longest prefix match
  2. return if it's exact match
  3. 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
}