 exports.target_parse_req = target_parse_req = (remember_me, url) ->
     v          = url.split('/')
     project_id = v[1]
-    type       = v[2]  # 'port' or 'raw'
+    type       = v[2]  # 'port' or 'raw' or 'server'
     key        = remember_me + project_id + type
+    internal_url = undefined   # if defined, this is the UTL called
     if type == 'port'
         key += v[3]
         port = v[3]
-    return {key:key, type:type, project_id:project_id, port_number:port}
+    else if type == 'server'
+        key += v[3]
+        port = v[3]
+        internal_url = v.slice(4).join('/')
+    return {key:key, type:type, project_id:project_id, port_number:port, internal_url:internal_url}
 
 exports.jupyter_server_port = jupyter_server_port = (opts) ->
     opts = defaults opts,

        delete _target_cache[key]

    target = (remember_me, url, cb) ->
        {key, type, project_id, port_number} = target_parse_req(remember_me, url)

        t = _target_cache[key]
        if t?
            cb(false, t)
            return

        dbg = (m) -> winston.debug("target(#{key}): #{m}")


            return

        target remember_me, req_url, (err, location, internal_url) ->
            dbg("got target: #{misc.walltime(tm)}")
            if err
                public_raw req_url, query, res, (err, is_public) ->
