Initial commit for OpenECOMP SDN-C OA&M
[sdnc/oam.git] / dgbuilder / dgeflows / node_modules / express / node_modules / serve-static / index.js
diff --git a/dgbuilder/dgeflows/node_modules/express/node_modules/serve-static/index.js b/dgbuilder/dgeflows/node_modules/express/node_modules/serve-static/index.js
new file mode 100644 (file)
index 0000000..0d1d9fb
--- /dev/null
@@ -0,0 +1,138 @@
+/*!
+ * serve-static
+ * Copyright(c) 2010 Sencha Inc.
+ * Copyright(c) 2011 TJ Holowaychuk
+ * Copyright(c) 2014 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var escapeHtml = require('escape-html');
+var merge = require('utils-merge');
+var parseurl = require('parseurl');
+var resolve = require('path').resolve;
+var send = require('send');
+var url = require('url');
+
+/**
+ * @param {String} root
+ * @param {Object} options
+ * @return {Function}
+ * @api public
+ */
+
+exports = module.exports = function serveStatic(root, options) {
+  if (!root) {
+    throw new TypeError('root path required')
+  }
+
+  if (typeof root !== 'string') {
+    throw new TypeError('root path must be a string')
+  }
+
+  // copy options object
+  options = merge({}, options)
+
+  // resolve root to absolute
+  root = resolve(root)
+
+  // default redirect
+  var redirect = options.redirect !== false
+
+  // headers listener
+  var setHeaders = options.setHeaders
+  delete options.setHeaders
+
+  if (setHeaders && typeof setHeaders !== 'function') {
+    throw new TypeError('option setHeaders must be function')
+  }
+
+  // setup options for send
+  options.maxage = options.maxage || options.maxAge || 0
+  options.root = root
+
+  return function serveStatic(req, res, next) {
+    if (req.method !== 'GET' && req.method !== 'HEAD') {
+      return next()
+    }
+
+    var opts = merge({}, options)
+    var originalUrl = parseurl.original(req)
+    var path = parseurl(req).pathname
+    var hasTrailingSlash = originalUrl.pathname[originalUrl.pathname.length - 1] === '/'
+
+    if (path === '/' && !hasTrailingSlash) {
+      // make sure redirect occurs at mount
+      path = ''
+    }
+
+    // create send stream
+    var stream = send(req, path, opts)
+
+    if (redirect) {
+      // redirect relative to originalUrl
+      stream.on('directory', function redirect() {
+        if (hasTrailingSlash) {
+          return next()
+        }
+
+        // append trailing slash
+        originalUrl.path = null
+        originalUrl.pathname = collapseLeadingSlashes(originalUrl.pathname + '/')
+
+        // reformat the URL
+        var target = url.format(originalUrl)
+
+        // send redirect response
+        res.statusCode = 303
+        res.setHeader('Content-Type', 'text/html; charset=utf-8')
+        res.setHeader('Location', target)
+        res.end('Redirecting to <a href="' + escapeHtml(target) + '">' + escapeHtml(target) + '</a>\n')
+      })
+    } else {
+      // forward to next middleware on directory
+      stream.on('directory', next)
+    }
+
+    // add headers listener
+    if (setHeaders) {
+      stream.on('headers', setHeaders)
+    }
+
+    // forward non-404 errors
+    stream.on('error', function error(err) {
+      next(err.status === 404 ? null : err)
+    })
+
+    // pipe
+    stream.pipe(res)
+  }
+}
+
+/**
+ * Expose mime module.
+ *
+ * If you wish to extend the mime table use this
+ * reference to the "mime" module in the npm registry.
+ */
+
+exports.mime = send.mime
+
+/**
+ * Collapse all leading slashes into a single slash
+ * @private
+ */
+function collapseLeadingSlashes(str) {
+  for (var i = 0; i < str.length; i++) {
+    if (str[i] !== '/') {
+      break
+    }
+  }
+
+  return i > 1
+    ? '/' + str.substr(i)
+    : str
+}