[Pkg-javascript-commits] [pdf.js] 117/161: Replaces pythons web server

David Prévot taffit at moszumanska.debian.org
Sat Apr 19 14:16:36 UTC 2014


This is an automated email from the git hooks/post-receive script.

taffit pushed a commit to branch master
in repository pdf.js.

commit 4df24f457aceb77ab7660222253edb4d15243a61
Author: Yury Delendik <ydelendik at mozilla.com>
Date:   Fri Mar 21 19:47:23 2014 -0500

    Replaces pythons web server
---
 make.js           |   7 +-
 test/webserver.js | 250 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 255 insertions(+), 2 deletions(-)

diff --git a/make.js b/make.js
index 418947e..da7624e 100644
--- a/make.js
+++ b/make.js
@@ -1248,8 +1248,10 @@ target.server = function() {
   echo();
   echo('### Starting local server');
 
-  cd('test');
-  exec(PYTHON_BIN + ' -u test.py --port=8888 --noDownload', {async: true});
+  var WebServer = require('./test/webserver.js').WebServer;
+  var server = new WebServer();
+  server.port = 8888;
+  server.start();
 };
 
 //
@@ -1267,6 +1269,7 @@ target.lint = function() {
                     'web/',
                     'test/driver.js',
                     'test/reporter.js',
+                    'test/webserver.js',
                     'test/unit/',
                     'extensions/firefox/',
                     'extensions/chromium/'
diff --git a/test/webserver.js b/test/webserver.js
new file mode 100644
index 0000000..670206d
--- /dev/null
+++ b/test/webserver.js
@@ -0,0 +1,250 @@
+/* -*- Mode: js; js-indent-level: 2; indent-tabs-mode: nil; tab-width: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+/*
+ * Copyright 2014 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*jslint node: true */
+
+'use strict';
+
+var http = require('http');
+var path = require('path');
+var fs = require('fs');
+
+var mimeTypes = {
+  '.css': 'text/css',
+  '.html': 'text/html',
+  '.js': 'application/javascript',
+  '.json': 'application/json',
+  '.svg': 'image/svg+xml',
+  '.pdf': 'application/pdf',
+  '.xhtml': 'application/xhtml+xml',
+  '.gif': 'image/gif',
+  '.ico': 'image/x-icon',
+  '.png': 'image/png',
+  '.log': 'text/plain',
+  '.bcmap': 'application/octet-stream',
+  '.properties': 'text/plain'
+};
+
+var defaultMimeType = 'application/octet-stream';
+
+function WebServer() {
+  this.root = '.';
+  this.host = 'localhost';
+  this.port = 8000;
+  this.server = null;
+  this.verbose = false;
+  this.hooks = {
+    'GET': [],
+    'POST': []
+  };
+}
+WebServer.prototype = {
+  start: function (callback) {
+    this.server = http.createServer(this._handler.bind(this));
+    this.server.listen(this.port, this.host, callback);
+    console.log(
+      'Server running at http://' + this.host + ':' + this.port + '/');
+  },
+  stop: function (callback) {
+    this.server.close(callback);
+    this.server = null;
+  },
+  _handler: function (req, res) {
+    var url = req.url;
+    var urlParts = /([^?]*)((?:\?(.*))?)/.exec(url);
+    var pathPart = decodeURI(urlParts[1]), queryPart = urlParts[3];
+    var verbose = this.verbose;
+
+    var methodHooks = this.hooks[req.method];
+    if (!methodHooks) {
+      res.writeHead(405);
+      res.end('Unsupported request method', 'utf8');
+      return;
+    }
+    var handled = methodHooks.some(function (hook) {
+      return hook(req, res);
+    });
+    if (handled) {
+      return;
+    }
+
+    if (pathPart === '/favicon.ico') {
+      fs.realpath(path.join(this.root, 'test/resources/favicon.ico'),
+                  checkFile);
+      return;
+    }
+
+    var filePath;
+    fs.realpath(path.join(this.root, pathPart), checkFile);
+
+    function checkFile(err, file) {
+      if (err) {
+        res.writeHead(404);
+        res.end();
+        if (verbose) {
+          console.error(url + ': not found');
+        }
+        return;
+      }
+      filePath = file;
+      fs.stat(filePath, statFile);
+    }
+
+    var fileSize;
+
+    function statFile(err, stats) {
+      if (err) {
+        res.writeHead(500);
+        res.end();
+        return;
+      }
+
+      fileSize = stats.size;
+      var isDir = stats.isDirectory();
+      if (isDir && !/\/$/.test(pathPart)) {
+        res.setHeader('Location', pathPart + '/' + urlParts[2]);
+        res.writeHead(301);
+        res.end('Redirected', 'utf8');
+        return;
+      }
+      if (isDir) {
+        serveDirectoryIndex(filePath);
+        return;
+      }
+
+      var range = req.headers['range'];
+      if (range) {
+        var rangesMatches = /^bytes=(\d+)\-(\d+)?/.exec(range);
+        if (!rangesMatches) {
+          res.writeHead(501);
+          res.end('Bad range', 'utf8');
+          if (verbose) {
+            console.error(url + ': bad range: "' + range + '"');
+          }
+          return;
+        }
+        var start = +rangesMatches[1];
+        var end = +rangesMatches[2];
+        if (verbose) {
+          console.log(url + ': range ' + start + ' - ' + end);
+        }
+        serveRequestedFileRange(filePath,
+                                start,
+                                isNaN(end) ? fileSize : (end + 1));
+        return;
+      }
+      if (verbose) {
+        console.log(url);
+      }
+      serveRequestedFile(filePath);
+    }
+
+    function serveDirectoryIndex(dir) {
+      res.setHeader('Content-Type', 'text/html');
+      res.writeHead(200);
+
+      var content = '';
+      if (queryPart === 'frame') {
+        res.end('<html><frameset cols=*,200><frame name=pdf>' +
+          '<frame src=\"' + encodeURI(pathPart) +
+          '?side\"></frameset></html>', 'utf8');
+        return;
+      }
+      var all = queryPart === 'all';
+      fs.readdir(dir, function (err, files) {
+        if (err) {
+          res.end();
+          return;
+        }
+        res.write('<html><body><h1>PDFs of ' + pathPart + '</h1>\n');
+        if (pathPart !== '/') {
+          res.write('<a href=\"..\">..</a><br>\n');
+        }
+        files.forEach(function (file) {
+          var stat = fs.statSync(path.join(dir, file));
+          var item = pathPart + file;
+          if (stat.isDirectory()) {
+            res.write('<a href=\"' + encodeURI(item) + '\">' +
+              file + '</a><br>\n');
+            return;
+          }
+          var ext = path.extname(file).toLowerCase();
+          if (ext === '.pdf') {
+            res.write('<a href=\"/web/viewer.html?file=' +
+              encodeURI(item) + '\" target=pdf>' +
+              file + '</a><br>\n');
+          } else if (all) {
+            res.write('<a href=\"' + encodeURI(item) + '\">' +
+              file + '</a><br>\n');
+          }
+        });
+        if (files.length === 0) {
+          res.write('<p>no files found</p>\n');
+        }
+        if (!all && queryPart !== 'side') {
+          res.write('<hr><p>(only PDF files are shown, ' +
+            '<a href=\"?all\">show all</a>)</p>\n');
+        }
+        res.end('</body></html>');
+      });
+    }
+
+    function serveRequestedFile(filePath) {
+      var stream = fs.createReadStream(filePath, {flags: 'rs'});
+
+      stream.on('error', function (error) {
+        res.writeHead(500);
+        res.end();
+      });
+
+      var ext = path.extname(filePath).toLowerCase();
+      var contentType = mimeTypes[ext] || defaultMimeType;
+
+      res.setHeader('Accept-Ranges', 'bytes');
+      res.setHeader('Content-Type', contentType);
+      res.setHeader('Content-Length', fileSize);
+      res.writeHead(200);
+
+      stream.pipe(res);
+    }
+
+    function serveRequestedFileRange(filePath, start, end) {
+      var stream = fs.createReadStream(filePath, {
+        flags: 'rs', start: start, end: end - 1});
+
+      stream.on('error', function (error) {
+        res.writeHead(500);
+        res.end();
+      });
+
+      var ext = path.extname(filePath).toLowerCase();
+      var contentType = mimeTypes[ext] || defaultMimeType;
+
+      res.setHeader('Accept-Ranges', 'bytes');
+      res.setHeader('Content-Type', contentType);
+      res.setHeader('Content-Length', (end - start));
+      res.setHeader('Content-Range',
+        'bytes ' + start + '-' + (end - 1) + '/' + fileSize);
+      res.writeHead(206);
+
+      stream.pipe(res);
+    }
+
+  }
+};
+
+exports.WebServer = WebServer;

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/pdf.js.git



More information about the Pkg-javascript-commits mailing list