michael@0: // Parse the query string, and give us the value for a certain key, or false if michael@0: // it does not exist. michael@0: function parseQuery(request, key) { michael@0: var params = request.queryString.split('?')[0].split('&'); michael@0: for (var j = 0; j < params.length; ++j) { michael@0: var p = params[j]; michael@0: if (p == key) michael@0: return true; michael@0: if (p.indexOf(key + "=") == 0) michael@0: return p.substring(key.length + 1); michael@0: if (p.indexOf("=") < 0 && key == "") michael@0: return p; michael@0: } michael@0: return false; michael@0: } michael@0: michael@0: function handleRequest(request, response) { michael@0: try { michael@0: // Get the filename to send back. michael@0: var filename = parseQuery(request, "file"); michael@0: michael@0: const CC = Components.Constructor; michael@0: const BinaryOutputStream = CC("@mozilla.org/binaryoutputstream;1", michael@0: "nsIBinaryOutputStream", michael@0: "setOutputStream"); michael@0: var file = Components.classes["@mozilla.org/file/directory_service;1"]. michael@0: getService(Components.interfaces.nsIProperties). michael@0: get("CurWorkD", Components.interfaces.nsILocalFile); michael@0: var fis = Components.classes['@mozilla.org/network/file-input-stream;1']. michael@0: createInstance(Components.interfaces.nsIFileInputStream); michael@0: var bis = Components.classes["@mozilla.org/binaryinputstream;1"]. michael@0: createInstance(Components.interfaces.nsIBinaryInputStream); michael@0: var paths = "tests/content/media/test/" + filename; michael@0: dump(paths + '\n'); michael@0: var split = paths.split("/"); michael@0: for(var i = 0; i < split.length; ++i) { michael@0: file.append(split[i]); michael@0: } michael@0: fis.init(file, -1, -1, false); michael@0: michael@0: // handle range requests michael@0: var partialstart = 0, michael@0: partialend = file.fileSize - 1; michael@0: if (request.hasHeader("Range")) { michael@0: var range = request.getHeader("Range"); michael@0: var parts = range.replace(/bytes=/, "").split("-"); michael@0: var partialstart = parts[0]; michael@0: var partialend = parts[1]; michael@0: if (!partialend.length) { michael@0: partialend = file.fileSize - 1; michael@0: } michael@0: response.setStatusLine(request.httpVersion, 206, "Partial Content"); michael@0: var contentRange = "bytes " + partialstart + "-" + partialend + "/" + file.fileSize; michael@0: response.setHeader("Content-Range", contentRange); michael@0: } michael@0: michael@0: fis.seek(Components.interfaces.nsISeekableStream.NS_SEEK_SET, partialstart); michael@0: bis.setInputStream(fis); michael@0: michael@0: var sendContentType = parseQuery(request, "nomime"); michael@0: if (sendContentType == false) { michael@0: var contentType = parseQuery(request, "type"); michael@0: if (contentType == false) { michael@0: // This should not happen. michael@0: dump("No type specified without having \'nomime\' in parameters."); michael@0: return; michael@0: } michael@0: response.setHeader("Content-Type", contentType, false); michael@0: } michael@0: response.setHeader("Content-Length", ""+bis.available(), false); michael@0: michael@0: var bytes = bis.readBytes(bis.available()); michael@0: response.write(bytes, bytes.length); michael@0: } catch (e) { michael@0: dump ("ERROR : " + e + "\n"); michael@0: } michael@0: }