include /etc/nginx/conf.d/include/init-optional-variables;

location / {
    set $skylink "";
    set $path $uri;

    rewrite_by_lua_block {
        local cjson = require("cjson")
        local cache = ngx.shared.dnslink
        local cache_value = cache:get(ngx.var.host)

        if cache_value == nil then
            local httpc = require("resty.http").new()

            -- 10.10.10.55 points to dnslink-api service (alias not available when using resty-http)
            local res, err = httpc:request_uri("http://10.10.10.55:3100/dnslink/" .. ngx.var.host)

            if err or (res and res.status ~= ngx.HTTP_OK) then
                -- check whether we can fallback to regular skylink request
                local match_skylink = ngx.re.match(ngx.var.uri, "^/([a-zA-Z0-9-_]{46}|[a-z0-9]{55})(/.*)?")

                if match_skylink then
                    ngx.var.skylink = match_skylink[1]
                    ngx.var.path = match_skylink[2] or "/"
                else
                    ngx.status = (err and ngx.HTTP_INTERNAL_SERVER_ERROR) or res.status
                    ngx.header["content-type"] = "text/plain"
                    ngx.say(err or res.body)
                    ngx.exit(ngx.status)
                end
            else
                local resolved = cjson.decode(res.body)

                ngx.var.skylink = resolved.skylink
                if resolved.sponsor then
                    ngx.req.set_header("Skynet-Api-Key", resolved.sponsor)
                end

                local cache_ttl = 300 -- 5 minutes cache expire time
                cache:set(ngx.var.host, res.body, cache_ttl)
            end
        else
            local resolved = cjson.decode(cache_value)

            ngx.var.skylink = resolved.skylink
            if resolved.sponsor then
                ngx.req.set_header("Skynet-Api-Key", resolved.sponsor)
            end
        end

        ngx.var.skylink = require("skynet.skylink").parse(ngx.var.skylink)
    }

    include /etc/nginx/conf.d/include/location-skylink;
}
