[
https://issues.apache.org/jira/browse/CB-9127?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14578542#comment-14578542
]
ASF GitHub Bot commented on CB-9127:
------------------------------------
Github user vladimir-kotikov commented on a diff in the pull request:
https://github.com/apache/cordova-lib/pull/238#discussion_r31990672
--- Diff: cordova-serve/src/server.js ---
@@ -0,0 +1,137 @@
+/**
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you 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.
+ */
+
+var fs = require('fs'),
+ http = require('http'),
+ url = require('url'),
+ path = require('path'),
+ Q = require('q'),
+ stream = require('./stream');
+
+/**
+ * @desc Launches a server with the specified options and optional custom
handlers.
+ * @param {{root: ?string, port: ?number, urlPathProcessor: ?function,
streamHandler: ?function, serverExtender: ?function}} opts
+ * @returns {*|promise}
+ */
+module.exports = function (opts) {
+ var deferred = Q.defer();
+
+ var root = opts.root;
+ var port = opts.port || 8000;
+
+ var server = http.createServer(function (request, response) {
+ function do404() {
+ console.log('404 ' + request.url);
+ response.writeHead(404, {'Content-Type': 'text/plain'});
+ response.write('404 Not Found\n');
+ response.end();
+ }
+
+ function do302(where) {
+ console.log('302 ' + request.url);
+ response.setHeader('Location', where);
+ response.writeHead(302, {'Content-Type': 'text/plain'});
+ response.end();
+ }
+
+ function do304() {
+ console.log('304 ' + request.url);
+ response.writeHead(304, {'Content-Type': 'text/plain'});
+ response.end();
+ }
+
+ function isFileChanged(path) {
+ var mtime = fs.statSync(path).mtime,
+ itime = request.headers['if-modified-since'];
+ return !itime || new Date(mtime) > new Date(itime);
+ }
+
+ var urlPath = url.parse(request.url).pathname;
+
+ var filePath;
+ if (opts.urlPathProcessor) {
+ var result = opts.urlPathProcessor(urlPath, request, response,
do302, do404);
+ if (!result) {
+ return;
+ }
+ filePath = result.filePath;
+ }
+ if (!filePath) {
+ if (!root) {
+ throw new Error('No server root directory HAS BEEN
specified!');
+ }
+ filePath = path.join(root, urlPath);
+ }
+
+ fs.exists(filePath, function (exists) {
+ if (!exists) {
+ do404();
+ return;
+ }
+ if (fs.statSync(filePath).isDirectory()) {
+ var index = path.join(filePath, 'index.html');
+ try {
+ if (fs.statSync(index)) {
+ filePath = index;
+ }
+ } catch (e) {
+ }
+ }
+ if (fs.statSync(filePath).isDirectory()) {
+ if (!/\/$/.test(urlPath)) {
+ do302(request.url + '/');
+ return;
+ }
+ console.log('200 ' + request.url);
+ response.writeHead(200, {'Content-Type': 'text/html'});
+ response.write('<html><head><title>Directory listing of '
+ urlPath + '</title></head>');
+ response.write('<h3>Items in this directory</h3>');
+ response.write('<ul>');
+ fs.readdirSync(filePath).forEach(function (file) {
+ if (file) {
+ response.write('<li><a href="' + file + '">' +
file + '</a></li>\n');
+ }
+ });
+
+ response.write('</ul>');
+ response.end();
+ } else if (!isFileChanged(filePath)) {
+ do304();
+ } else {
+ (opts.streamHandler && opts.streamHandler(filePath,
request, response)) || stream(filePath, request, response);
--- End diff --
nit: This is more readable and do not require `-W030` for JSHint:
```
var streamHandler = opts.streamHandler || stream;
streamHandler(...params...)
```
> Implement cordova-serve module
> ------------------------------
>
> Key: CB-9127
> URL: https://issues.apache.org/jira/browse/CB-9127
> Project: Apache Cordova
> Issue Type: Improvement
> Components: Browser, CordovaLib
> Reporter: Tim Barham
> Assignee: Tim Barham
>
> The `cordova serve` command provided by `cordova-lib`, and `cordova run
> browser` provided `cordova-browser` both provide basic server functionality
> that is duplicated in two places. We should combine this into a single
> `cordova-serve` module that can be used by both.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]