###########
# mempool #
###########

# Block the internal APIs of esplora
location /testnet/api/internal/ {
	return 404;
}
location /testnet/api/v1/internal/ {
	return 404;
}

# websocket has special HTTP headers
location /testnet/api/v1/ws {
	rewrite ^/testnet/(.*) /$1 break;
	try_files /dev/null @mempool-testnet-api-v1-websocket;
}

# warm cache mining and mempool API responses
location /testnet/api/v1/statistics {
	rewrite ^/testnet/(.*) /$1 break;
	try_files /dev/null @mempool-testnet-api-v1-cache-warm;
}
location /testnet/api/v1/mining {
	rewrite ^/testnet/(.*) /$1 break;
	try_files /dev/null @mempool-testnet-api-v1-cache-warm;
}

# it's ok to cache blockchain data "forever", so we do 30d
location /testnet/api/v1/block/ {
	rewrite ^/testnet/(.*) /$1 break;
	try_files /dev/null @mempool-testnet-api-v1-cache-forever;
}

# everything else gets "normal" cache
location /testnet/api/v1 {
	rewrite ^/testnet/(.*) /$1 break;
	try_files /dev/null @mempool-testnet-api-v1-cache-normal;
}

###########
# esplora #
###########

# it's ok to cache blockchain data "forever", so we do 30d
location /testnet/api/block/ {
	rewrite ^/testnet/api/(.*) /$1 break;
	try_files /dev/null @esplora-testnet-api-cache-forever;
}
# other API responses cannot be cached
location /testnet/api/ {
	rewrite ^/testnet/api/(.*) /$1 break;
	try_files /dev/null @esplora-testnet-api-cache-disabled;
}

###########
# routing #
###########

location @mempool-testnet-api-v1-websocket {
	proxy_pass $mempoolTestnet;
	proxy_http_version 1.1;

	proxy_set_header Host $host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	proxy_set_header Upgrade $http_upgrade;
	proxy_set_header Connection "upgrade";
	proxy_set_header X-Forwarded-Proto $scheme;
}

location @mempool-testnet-api-v1-cache-forever {
	proxy_pass $mempoolTestnet;

	proxy_set_header Host $host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	proxy_set_header X-Forwarded-Proto $scheme;

	proxy_cache_background_update on;
	proxy_cache_use_stale updating;
	proxy_cache apicold;
	proxy_cache_valid 200 30d;
	proxy_redirect off;

	expires 30d;
}

location @mempool-testnet-api-v1-cache-warm {
	proxy_pass $mempoolTestnet;

	proxy_set_header Host $host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	proxy_set_header X-Forwarded-Proto $scheme;

	proxy_cache_background_update on;
	proxy_cache_use_stale updating;
	proxy_cache apiwarm;
	proxy_cache_valid 200 10s;
	proxy_redirect off;
}

location @mempool-testnet-api-v1-cache-normal {
	proxy_pass $mempoolTestnet;

	proxy_set_header Host $host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	proxy_set_header X-Forwarded-Proto $scheme;

	proxy_cache apinormal;
	proxy_cache_valid 200 10s;
	proxy_redirect off;

	expires 10s;
}

location @mempool-testnet-api-v1-cache-disabled {
	proxy_pass $mempoolTestnet;

	proxy_set_header Host $host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	proxy_set_header X-Forwarded-Proto $scheme;

	proxy_redirect off;
	proxy_buffering off;

	expires -1;
}

location @esplora-testnet-api-cache-disabled {
	proxy_pass $esploraTestnet;

	proxy_set_header Host $host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	proxy_set_header X-Forwarded-Proto $scheme;

	proxy_redirect off;
	proxy_buffering off;

	expires -1;
}

location @esplora-testnet-api-cache-forever {
	proxy_pass $esploraTestnet;

	proxy_set_header Host $host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	proxy_set_header X-Forwarded-Proto $scheme;

	proxy_cache_background_update on;
	proxy_cache_use_stale updating;
	proxy_cache apicold;
	proxy_cache_valid 200 30d;
	proxy_redirect off;

	expires 30d;
}
