content/media/test/contentType.sjs

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/content/media/test/contentType.sjs	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,77 @@
     1.4 +// Parse the query string, and give us the value for a certain key, or false if
     1.5 +// it does not exist.
     1.6 +function parseQuery(request, key) {
     1.7 +  var params = request.queryString.split('?')[0].split('&');
     1.8 +  for (var j = 0; j < params.length; ++j) {
     1.9 +    var p = params[j];
    1.10 +    if (p == key)
    1.11 +      return true;
    1.12 +    if (p.indexOf(key + "=") == 0)
    1.13 +      return p.substring(key.length + 1);
    1.14 +    if (p.indexOf("=") < 0 && key == "")
    1.15 +      return p;
    1.16 +  }
    1.17 +  return false;
    1.18 +}
    1.19 +
    1.20 +function handleRequest(request, response) {
    1.21 +  try {
    1.22 +    // Get the filename to send back.
    1.23 +    var filename = parseQuery(request, "file");
    1.24 +
    1.25 +    const CC = Components.Constructor;
    1.26 +    const BinaryOutputStream = CC("@mozilla.org/binaryoutputstream;1",
    1.27 +                                  "nsIBinaryOutputStream",
    1.28 +                                  "setOutputStream");
    1.29 +    var file = Components.classes["@mozilla.org/file/directory_service;1"].
    1.30 +      getService(Components.interfaces.nsIProperties).
    1.31 +      get("CurWorkD", Components.interfaces.nsILocalFile);
    1.32 +    var fis  = Components.classes['@mozilla.org/network/file-input-stream;1'].
    1.33 +      createInstance(Components.interfaces.nsIFileInputStream);
    1.34 +    var bis  = Components.classes["@mozilla.org/binaryinputstream;1"].
    1.35 +      createInstance(Components.interfaces.nsIBinaryInputStream);
    1.36 +    var paths = "tests/content/media/test/" + filename;
    1.37 +    dump(paths + '\n');
    1.38 +    var split = paths.split("/");
    1.39 +    for(var i = 0; i < split.length; ++i) {
    1.40 +      file.append(split[i]);
    1.41 +    }
    1.42 +    fis.init(file, -1, -1, false);
    1.43 +
    1.44 +    // handle range requests
    1.45 +    var partialstart = 0,
    1.46 +        partialend = file.fileSize - 1;
    1.47 +    if (request.hasHeader("Range")) {
    1.48 +      var range = request.getHeader("Range");
    1.49 +      var parts = range.replace(/bytes=/, "").split("-");
    1.50 +      var partialstart = parts[0];
    1.51 +      var partialend = parts[1];
    1.52 +      if (!partialend.length) {
    1.53 +        partialend = file.fileSize - 1;
    1.54 +      }
    1.55 +      response.setStatusLine(request.httpVersion, 206, "Partial Content");
    1.56 +      var contentRange = "bytes " + partialstart + "-" + partialend + "/" + file.fileSize;
    1.57 +      response.setHeader("Content-Range", contentRange);
    1.58 +    }
    1.59 +
    1.60 +    fis.seek(Components.interfaces.nsISeekableStream.NS_SEEK_SET, partialstart);
    1.61 +    bis.setInputStream(fis);
    1.62 +
    1.63 +    var sendContentType = parseQuery(request, "nomime");
    1.64 +    if (sendContentType == false) {
    1.65 +      var contentType = parseQuery(request, "type");
    1.66 +      if (contentType == false) {
    1.67 +        // This should not happen.
    1.68 +        dump("No type specified without having \'nomime\' in parameters.");
    1.69 +        return;
    1.70 +      }
    1.71 +      response.setHeader("Content-Type", contentType, false);
    1.72 +    }
    1.73 +    response.setHeader("Content-Length", ""+bis.available(), false);
    1.74 +
    1.75 +    var bytes = bis.readBytes(bis.available());
    1.76 +    response.write(bytes, bytes.length);
    1.77 +  } catch (e) {
    1.78 +    dump ("ERROR : " + e + "\n");
    1.79 +  }
    1.80 +}

mercurial