Public
Edited
Feb 21
Insert cell
Insert cell
allUsers2 = allUsers()
Insert cell
Insert cell
cors = 'https://corsproxy.io/?'//
Insert cell
url = cors + 'url=https://opensnp.org/users.json'
Insert cell
// get all users with genotype data (23andMe, illumina, ancestry etc)
allUsers = async function () {
const db = 'userDB';
//let dt = await localforage.getItem('usersFull'); // check for users in localstorage
let dt = null
if (dt == null) {
let url = cors + 'url=https://opensnp.org/users.json'
dt = (await(await (await fetch(url)))).json()//.sort((a, b) => a.id - b.id)
userDB.setItem('usersFull', dt)
}
return dt
}
Insert cell
Insert cell
Insert cell
Insert cell
cors2 = require('cors')
Insert cell
Insert cell
function cors3(request){
console.log("request1",request)

//async fetch(request) {
const corsHeaders = {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "GET,HEAD,POST,OPTIONS",
"Access-Control-Max-Age": "86400",
}
console.log("corsHeaders",corsHeaders)

// The URL for the remote third party API you want to fetch from
// but does not implement CORS
const API_URL = "https://gist.githubusercontent.com/xprilion/33cc85952d317644c944274ee6071547/raw/300db56b3b4cc2d5f99d7dde9b4274ac433fef12/iris.json"//"https://examples.cloudflareworkers.com/demos/demoapi";

// The endpoint you want the CORS reverse proxy to be on
const PROXY_ENDPOINT = "/corsproxy/";

// The rest of this snippet for the demo page
function rawHtmlResponse(html) {
return new Response(html, {
headers: {
"content-type": "text/html;charset=UTF-8",
},
});
}

const DEMO_PAGE = `
<!DOCTYPE html>
<html>
<body>
<h1>API GET without CORS Proxy</h1>
<a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch#Checking_that_the_fetch_was_successful">Shows TypeError: Failed to fetch since CORS is misconfigured</a>
<p id="noproxy-status"/>
<code id="noproxy">Waiting</code>
<h1>API GET with CORS Proxy</h1>
<p id="proxy-status"/>
<code id="proxy">Waiting</code>
<h1>API POST with CORS Proxy + Preflight</h1>
<p id="proxypreflight-status"/>
<code id="proxypreflight">Waiting</code>
<script>
let reqs = {};
reqs.noproxy = () => {
return fetch("${API_URL}").then(r => r.json())
}
reqs.proxy = async () => {
let href = "${PROXY_ENDPOINT}?apiurl=${API_URL}"
return fetch(window.location.origin + href).then(r => r.json())
}
reqs.proxypreflight = async () => {
let href = "${PROXY_ENDPOINT}?apiurl=${API_URL}"
let response = await fetch(window.location.origin + href, {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
msg: "Hello world!"
})
})
return response.json()
}
(async () => {
for (const [reqName, req] of Object.entries(reqs)) {
try {
let data = await req()
document.getElementById(reqName).innerHTML = JSON.stringify(data)
} catch (e) {
document.getElementById(reqName).innerHTML = e
}
}
})()
</script>
</body>
</html>
`;

async function handleRequest(request) {
console.log("request2",request)
const url = new URL(request.url);
let apiUrl = url.searchParams.get("apiurl");

if (apiUrl == null) {
apiUrl = API_URL;
}

// Rewrite request to point to API URL. This also makes the request mutable
// so you can add the correct Origin header to make the API server think
// that this request is not cross-site.
request = new Request(apiUrl, request);
console.log("request new",request)

request.headers.set("Origin", new URL(apiUrl).origin);
let response = await fetch(request);
// Recreate the response so you can modify the headers

response = new Response(response.body, response);
// Set CORS headers

response.headers.set("Access-Control-Allow-Origin", url.origin);

// Append to/Add Vary header so browser will cache response correctly
response.headers.append("Vary", "Origin");

return response;
}

async function handleOptions(request) {
console.log("handleOptions",request)

if (
request.headers.get("Origin") !== null &&
request.headers.get("Access-Control-Request-Method") !== null &&
request.headers.get("Access-Control-Request-Headers") !== null
) {
// Handle CORS preflight requests.
return new Response(null, {
headers: {
...corsHeaders,
"Access-Control-Allow-Headers": request.headers.get(
"Access-Control-Request-Headers",
),
},
});
} else {
// Handle standard OPTIONS request.
return new Response(null, {
headers: {
Allow: "GET, HEAD, POST, OPTIONS",
},
});
}
}

const url = new URL(request);
console.log(" const url = new URL(request);",url,request)

if (url.pathname.startsWith(PROXY_ENDPOINT)) {
if (request.method === "OPTIONS") {
// Handle CORS preflight requests
return handleOptions(request);
} else if (
request.method === "GET" ||
request.method === "HEAD" ||
request.method === "POST"
) {
// Handle requests to the API server
return handleRequest(request);
} else {
return new Response(null, {
status: 405,
statusText: "Method Not Allowed",
});
}
} else {
console.log(" else demo",rawHtmlResponse(DEMO_PAGE))

return rawHtmlResponse(DEMO_PAGE);
}
}
Insert cell
Insert cell
cors3(jsonurl)
Insert cell
async function handleRequest(request){
const response = await fetch(request)
console.log("response",response)
const modifiedResponse = new Response(response.body, response)

modifiedResponse.headers.set('Access-Control-Allow-Origin', '*')
modifiedResponse.headers.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
modifiedResponse.headers.set('Access-Control-Allow-Headers', 'Content-Type, Authorization')
modifiedResponse.headers.set('Access-Control-Max-Age', '86400')
console.log("modifiedResponse",modifiedResponse)

return modifiedResponse
}
Insert cell
iris = handleRequest(jsonurl)
Insert cell
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request));
});
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more