detect byte serving support via Content-Length [#11]

This commit is contained in:
Brandon Liu
2021-04-29 10:59:21 +08:00
parent 1252b2496c
commit 62d56f5acc

View File

@@ -37,25 +37,23 @@ const bytesToMap = dataview => {
export class PMTiles { export class PMTiles {
constructor(url, options = {}) { constructor(url, options = {}) {
this.url = url this.url = url
this.root = fetch(this.url,{method:'HEAD',headers:{Range:'bytes=0-511999'}}).then(resp => { const controller = new AbortController()
// for servers like Azure, GH Pages which return 200 instead of 206 const signal = controller.signal
if (resp.status == 206 || (resp.status == 200 && options.allow_200)) { this.root = fetch(this.url,{signal:signal, headers:{Range:'bytes=0-511999'}}).then(resp => {
console.log("Check succeeded: server supports byte ranges") if (resp.headers.get('Content-Length') != 512000) {
return fetch(this.url,{headers:{Range:'bytes=0-511999'}}).then(resp => { console.error("Content-Length mismatch indicates byte serving not supported; aborting.")
return resp.arrayBuffer() controller.abort()
}).then(buf => { }
const header = parseHeader(new DataView(buf,0,10)) return resp.arrayBuffer()
var dec = new TextDecoder("utf-8") }).then(buf => {
return { const header = parseHeader(new DataView(buf,0,10))
metadata: JSON.parse(dec.decode(new DataView(buf,10,header.json_size))), var dec = new TextDecoder("utf-8")
dir:bytesToMap(new DataView(buf,10+header.json_size,17*header.root_entries)) return {
} metadata: JSON.parse(dec.decode(new DataView(buf,10,header.json_size))),
}) dir:bytesToMap(new DataView(buf,10+header.json_size,17*header.root_entries))
} else {
console.log("Check failed: if you know this server supports byte serving, pass allow_200: true")
throw new Error("Invalid response: " + resp.status)
} }
}) })
this.step = 0 this.step = 0
this.leaves = new Map() this.leaves = new Map()
this.outstanding_requests = new Map() this.outstanding_requests = new Map()