1function parseQuery(query, key) { 2 for (let p of query.split('&')) { 3 if (p == key) { 4 return true; 5 } 6 if (p.startsWith(key + "=")) { 7 return p.substring(key.length + 1); 8 } 9 } 10} 11 12// Return the first few bytes in a short byte range response. When Firefox 13// requests subsequent bytes in a second range request, respond with a 14// redirect. Requests after the first redirected are serviced as expected. 15function handleRequest(request, response) 16{ 17 var query = request.queryString; 18 var resource = parseQuery(query, "resource"); 19 var type = parseQuery(query, "type") || "application/octet-stream"; 20 var redirected = parseQuery(query, "redirected") || false; 21 var useCors = parseQuery(query, "cors") || false; 22 23 var file = Components.classes["@mozilla.org/file/directory_service;1"]. 24 getService(Components.interfaces.nsIProperties). 25 get("CurWorkD", Components.interfaces.nsIFile); 26 var fis = Components.classes['@mozilla.org/network/file-input-stream;1']. 27 createInstance(Components.interfaces.nsIFileInputStream); 28 var bis = Components.classes["@mozilla.org/binaryinputstream;1"]. 29 createInstance(Components.interfaces.nsIBinaryInputStream); 30 var paths = "tests/dom/media/test/" + resource; 31 var split = paths.split("/"); 32 for (var i = 0; i < split.length; ++i) { 33 file.append(split[i]); 34 } 35 fis.init(file, -1, -1, false); 36 37 bis.setInputStream(fis); 38 var bytes = bis.readBytes(bis.available()); 39 let [from, to] = request.getHeader("range").split("=")[1].split("-").map(s => parseInt(s)); 40 41 if (!redirected && from > 0) { 42 var origin = request.host == "mochi.test" ? "example.org" : "mochi.test:8888"; 43 response.setStatusLine(request.httpVersion, 303, "See Other"); 44 let url = "http://" + origin + 45 "/tests/dom/media/test/midflight-redirect.sjs?redirected&" + query; 46 response.setHeader("Location", url); 47 response.setHeader("Content-Type", "text/html"); 48 return; 49 } 50 51 if (isNaN(to)) { 52 to = bytes.length - 1; 53 } 54 55 if (from == 0 && !redirected) { 56 to = parseInt(parseQuery(query, "redirectAt")) || Math.floor(bytes.length / 4); 57 } 58 to = Math.min(to, bytes.length - 1); 59 60 // Note: 'to' is the first index *excluded*, so we need (to + 1) 61 // in the substring end here. 62 byterange = bytes.substring(from, to + 1); 63 64 let contentRange = "bytes " + from + "-" + to + "/" + bytes.length; 65 let contentLength = byterange.length.toString(); 66 67 response.setStatusLine(request.httpVersion, 206, "Partial Content"); 68 response.setHeader("Content-Range", contentRange); 69 response.setHeader("Content-Length", contentLength, false); 70 response.setHeader("Content-Type", type, false); 71 response.setHeader("Accept-Ranges", "bytes", false); 72 response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); 73 if (redirected && useCors) { 74 response.setHeader("Access-Control-Allow-Origin", "*"); 75 } 76 response.write(byterange, byterange.length); 77 bis.close(); 78} 79