function parseUrl(url) { // XXX: Hack. let match = url.match(new RegExp("(\\w+)://([^/]+)?(.*)")); return { protocol: match[1], host: match[2], path: match[3], port: match[1] == "http" ? 80 : 443, }; } function parseResponse(data) { let firstLine; let headers = {}; while (true) { let endLine = data.indexOf('\r\n'); let line = data.substring(0, endLine); if (!firstLine) { firstLine = line; } else if (!line.length) { break; } else { let colon = line.indexOf(":"); headers[line.substring(colon)] = line.substring(colon + 1); } data = data.substring(endLine + 2); } return {body: data}; } export function fetch(url, options) { let parsed = parseUrl(url); return new Promise(function(resolve, reject) { let socket = new Socket(); let buffer = new Uint8Array(0) return socket.connect(parsed.host, parsed.port).then(function() { socket.read(function(data) { if (data) { let newBuffer = new Uint8Array(buffer.length + data.length); newBuffer.set(buffer, 0); newBuffer.set(data, buffer.length); buffer = newBuffer; } else { resolve(parseResponse(utf8Decode(buffer))); } }); if (parsed.port == 443) { return socket.startTls(); } }).then(function() { socket.write(`${options?.method ?? 'GET'} ${parsed.path} HTTP/1.0\r\nHost: ${parsed.host}\r\nConnection: close\r\n\r\n`); socket.shutdown(); }).catch(function(error) { reject(error); }); }); }