[Pkg-javascript-commits] [node-connect] 01/03: Imported Upstream version 3.4.1
Thorsten Alteholz
alteholz at moszumanska.debian.org
Sun Mar 27 20:59:47 UTC 2016
This is an automated email from the git hooks/post-receive script.
alteholz pushed a commit to branch master
in repository node-connect.
commit f70a9fbb20c5b6f4a8f7da74a70deefde827be5f
Author: Thorsten Alteholz <debian at alteholz.de>
Date: Sun Mar 27 19:46:34 2016 +0200
Imported Upstream version 3.4.1
---
.gitignore | 17 ++
.npmignore | 4 -
.travis.yml | 18 +-
History.md | 528 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
LICENSE | 1 +
Readme.md | 171 ++++++++++++------
index.js | 283 ++++++++++++++++++++++++++++-
lib/connect.js | 34 ----
lib/proto.js | 226 ------------------------
package.json | 21 ++-
test/fqdn.js | 12 +-
test/mounting.js | 20 +--
test/server.js | 99 +++++++++--
13 files changed, 1074 insertions(+), 360 deletions(-)
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..b83e672
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,17 @@
+coverage/
+.DS_Store
+pids
+logs
+results
+*.pid
+*.gz
+*.log
+test/fixtures/foo.bar.baz.css
+test/fixtures/style.css
+test/fixtures/script.js
+test.js
+docs/*.html
+docs/*.json
+node_modules
+.idea
+*.iml
diff --git a/.npmignore b/.npmignore
deleted file mode 100644
index 078c11e..0000000
--- a/.npmignore
+++ /dev/null
@@ -1,4 +0,0 @@
-coverage/
-docs/
-test/
-.travis.yml
diff --git a/.travis.yml b/.travis.yml
index 73568f2..23358de 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,10 +1,14 @@
language: node_js
node_js:
- "0.10"
- - "0.11"
-matrix:
- allow_failures:
- - node_js: "0.11"
- fast_finish: true
-script: "npm run-script test-travis"
-after_script: "npm install coveralls at 2.10.0 && cat ./coverage/lcov.info | coveralls"
+ - "0.12"
+ - "1.8"
+ - "2.5"
+ - "3.3"
+ - "4.2"
+ - "5.5"
+sudo: false
+script:
+ - "npm run-script test-travis"
+after_script:
+ - "npm install coveralls at 2 && cat ./coverage/lcov.info | coveralls"
diff --git a/History.md b/History.md
index 54ff075..ade42d6 100644
--- a/History.md
+++ b/History.md
@@ -1,3 +1,61 @@
+3.4.1 / 2016-01-23
+==================
+
+ * deps: finalhandler at 0.4.1
+ - deps: escape-html@~1.0.3
+ * deps: parseurl@~1.3.1
+ - perf: enable strict mode
+
+3.4.0 / 2015-06-18
+==================
+
+ * deps: debug@~2.2.0
+ - deps: ms at 0.7.1
+ * deps: finalhandler at 0.4.0
+ - Fix a false-positive when unpiping in Node.js 0.8
+ - Support `statusCode` property on `Error` objects
+ - Use `unpipe` module for unpiping requests
+ - deps: debug@~2.2.0
+ - deps: escape-html at 1.0.2
+ - deps: on-finished@~2.3.0
+ - perf: enable strict mode
+ - perf: remove argument reassignment
+ * perf: enable strict mode
+ * perf: remove argument reassignments
+
+3.3.5 / 2015-03-16
+==================
+
+ * deps: debug@~2.1.3
+ - Fix high intensity foreground color for bold
+ - deps: ms at 0.7.0
+ * deps: finalhandler at 0.3.4
+ - deps: debug@~2.1.3
+
+3.3.4 / 2015-01-07
+==================
+
+ * deps: debug@~2.1.1
+ * deps: finalhandler at 0.3.3
+ - deps: debug@~2.1.1
+ - deps: on-finished@~2.2.0
+
+3.3.3 / 2014-11-09
+==================
+
+ * Correctly invoke async callback asynchronously
+
+3.3.2 / 2014-10-28
+==================
+
+ * Fix handling of URLs containing `://` in the path
+
+3.3.1 / 2014-10-22
+==================
+
+ * deps: finalhandler at 0.3.2
+ - deps: on-finished@~2.1.1
+
3.3.0 / 2014-10-17
==================
@@ -74,6 +132,476 @@
* remove various private `connect.utils` functions
* drop node.js 0.8 support
+2.30.2 / 2015-07-31
+===================
+
+ * deps: body-parser@~1.13.3
+ - deps: type-is@~1.6.6
+ * deps: compression@~1.5.2
+ - deps: accepts@~1.2.12
+ - deps: compressible@~2.0.5
+ - deps: vary@~1.0.1
+ * deps: errorhandler@~1.4.2
+ - deps: accepts@~1.2.12
+ * deps: method-override@~2.3.5
+ - deps: vary@~1.0.1
+ - perf: enable strict mode
+ * deps: serve-index@~1.7.2
+ - deps: accepts@~1.2.12
+ - deps: mime-types@~2.1.4
+ * deps: type-is@~1.6.6
+ - deps: mime-types@~2.1.4
+ * deps: vhost@~3.0.1
+ - perf: enable strict mode
+
+2.30.1 / 2015-07-05
+===================
+
+ * deps: body-parser@~1.13.2
+ - deps: iconv-lite at 0.4.11
+ - deps: qs at 4.0.0
+ - deps: raw-body@~2.1.2
+ - deps: type-is@~1.6.4
+ * deps: compression@~1.5.1
+ - deps: accepts@~1.2.10
+ - deps: compressible@~2.0.4
+ * deps: errorhandler@~1.4.1
+ - deps: accepts@~1.2.10
+ * deps: qs at 4.0.0
+ - Fix dropping parameters like `hasOwnProperty`
+ - Fix various parsing edge cases
+ * deps: morgan@~1.6.1
+ - deps: basic-auth@~1.0.3
+ * deps: pause at 0.1.0
+ - Re-emit events with all original arguments
+ - Refactor internals
+ - perf: enable strict mode
+ * deps: serve-index@~1.7.1
+ - deps: accepts@~1.2.10
+ - deps: mime-types@~2.1.2
+ * deps: type-is@~1.6.4
+ - deps: mime-types@~2.1.2
+ - perf: enable strict mode
+ - perf: remove argument reassignment
+
+2.30.0 / 2015-06-18
+===================
+
+ * deps: body-parser@~1.13.1
+ - Add `statusCode` property on `Error`s, in addition to `status`
+ - Change `type` default to `application/json` for JSON parser
+ - Change `type` default to `application/x-www-form-urlencoded` for urlencoded parser
+ - Provide static `require` analysis
+ - Use the `http-errors` module to generate errors
+ - deps: bytes at 2.1.0
+ - deps: iconv-lite at 0.4.10
+ - deps: on-finished@~2.3.0
+ - deps: raw-body@~2.1.1
+ - deps: type-is@~1.6.3
+ - perf: enable strict mode
+ - perf: remove argument reassignment
+ - perf: remove delete call
+ * deps: bytes at 2.1.0
+ - Slight optimizations
+ - Units no longer case sensitive when parsing
+ * deps: compression@~1.5.0
+ - Fix return value from `.end` and `.write` after end
+ - Improve detection of zero-length body without `Content-Length`
+ - deps: accepts@~1.2.9
+ - deps: bytes at 2.1.0
+ - deps: compressible@~2.0.3
+ - perf: enable strict mode
+ - perf: remove flush reassignment
+ - perf: simplify threshold detection
+ * deps: cookie at 0.1.3
+ - Slight optimizations
+ * deps: cookie-parser@~1.3.5
+ - deps: cookie at 0.1.3
+ * deps: csurf@~1.8.3
+ - Add `sessionKey` option
+ - deps: cookie at 0.1.3
+ - deps: csrf@~3.0.0
+ * deps: errorhandler@~1.4.0
+ - Add charset to the `Content-Type` header
+ - Support `statusCode` property on `Error` objects
+ - deps: accepts@~1.2.9
+ - deps: escape-html at 1.0.2
+ * deps: express-session@~1.11.3
+ - Support an array in `secret` option for key rotation
+ - deps: cookie at 0.1.3
+ - deps: crc at 3.3.0
+ - deps: debug@~2.2.0
+ - deps: depd@~1.0.1
+ - deps: uid-safe@~2.0.0
+ * deps: finalhandler at 0.4.0
+ - Fix a false-positive when unpiping in Node.js 0.8
+ - Support `statusCode` property on `Error` objects
+ - Use `unpipe` module for unpiping requests
+ - deps: escape-html at 1.0.2
+ - deps: on-finished@~2.3.0
+ - perf: enable strict mode
+ - perf: remove argument reassignment
+ * deps: fresh at 0.3.0
+ - Add weak `ETag` matching support
+ * deps: morgan@~1.6.0
+ - Add `morgan.compile(format)` export
+ - Do not color 1xx status codes in `dev` format
+ - Fix `response-time` token to not include response latency
+ - Fix `status` token incorrectly displaying before response in `dev` format
+ - Fix token return values to be `undefined` or a string
+ - Improve representation of multiple headers in `req` and `res` tokens
+ - Use `res.getHeader` in `res` token
+ - deps: basic-auth@~1.0.2
+ - deps: on-finished@~2.3.0
+ - pref: enable strict mode
+ - pref: reduce function closure scopes
+ - pref: remove dynamic compile on every request for `dev` format
+ - pref: remove an argument reassignment
+ - pref: skip function call without `skip` option
+ * deps: serve-favicon@~2.3.0
+ - Send non-chunked response for `OPTIONS`
+ - deps: etag@~1.7.0
+ - deps: fresh at 0.3.0
+ - perf: enable strict mode
+ - perf: remove argument reassignment
+ - perf: remove bitwise operations
+ * deps: serve-index@~1.7.0
+ - Accept `function` value for `template` option
+ - Send non-chunked response for `OPTIONS`
+ - Stat parent directory when necessary
+ - Use `Date.prototype.toLocaleDateString` to format date
+ - deps: accepts@~1.2.9
+ - deps: escape-html at 1.0.2
+ - deps: mime-types@~2.1.1
+ - perf: enable strict mode
+ - perf: remove argument reassignment
+ * deps: serve-static@~1.10.0
+ - Add `fallthrough` option
+ - Fix reading options from options prototype
+ - Improve the default redirect response headers
+ - Malformed URLs now `next()` instead of 400
+ - deps: escape-html at 1.0.2
+ - deps: send at 0.13.0
+ - perf: enable strict mode
+ - perf: remove argument reassignment
+ * deps: type-is@~1.6.3
+ - deps: mime-types@~2.1.1
+ - perf: reduce try block size
+ - perf: remove bitwise operations
+
+2.29.2 / 2015-05-14
+===================
+
+ * deps: body-parser@~1.12.4
+ - Slight efficiency improvement when not debugging
+ - deps: debug@~2.2.0
+ - deps: depd@~1.0.1
+ - deps: iconv-lite at 0.4.8
+ - deps: on-finished@~2.2.1
+ - deps: qs at 2.4.2
+ - deps: raw-body@~2.0.1
+ - deps: type-is@~1.6.2
+ * deps: compression@~1.4.4
+ - deps: accepts@~1.2.7
+ - deps: debug@~2.2.0
+ * deps: connect-timeout@~1.6.2
+ - deps: debug@~2.2.0
+ - deps: ms at 0.7.1
+ * deps: debug@~2.2.0
+ - deps: ms at 0.7.1
+ * deps: depd@~1.0.1
+ * deps: errorhandler@~1.3.6
+ - deps: accepts@~1.2.7
+ * deps: finalhandler at 0.3.6
+ - deps: debug@~2.2.0
+ - deps: on-finished@~2.2.1
+ * deps: method-override@~2.3.3
+ - deps: debug@~2.2.0
+ * deps: morgan@~1.5.3
+ - deps: basic-auth@~1.0.1
+ - deps: debug@~2.2.0
+ - deps: depd@~1.0.1
+ - deps: on-finished@~2.2.1
+ * deps: qs at 2.4.2
+ - Fix allowing parameters like `constructor`
+ * deps: response-time@~2.3.1
+ - deps: depd@~1.0.1
+ * deps: serve-favicon@~2.2.1
+ - deps: etag@~1.6.0
+ - deps: ms at 0.7.1
+ * deps: serve-index@~1.6.4
+ - deps: accepts@~1.2.7
+ - deps: debug@~2.2.0
+ - deps: mime-types@~2.0.11
+ * deps: serve-static@~1.9.3
+ - deps: send at 0.12.3
+ * deps: type-is@~1.6.2
+ - deps: mime-types@~2.0.11
+
+2.29.1 / 2015-03-16
+===================
+
+ * deps: body-parser@~1.12.2
+ - deps: debug@~2.1.3
+ - deps: qs at 2.4.1
+ - deps: type-is@~1.6.1
+ * deps: compression@~1.4.3
+ - Fix error when code calls `res.end(str, encoding)`
+ - deps: accepts@~1.2.5
+ - deps: debug@~2.1.3
+ * deps: connect-timeout@~1.6.1
+ - deps: debug@~2.1.3
+ * deps: debug@~2.1.3
+ - Fix high intensity foreground color for bold
+ - deps: ms at 0.7.0
+ * deps: errorhandler@~1.3.5
+ - deps: accepts@~1.2.5
+ * deps: express-session@~1.10.4
+ - deps: debug@~2.1.3
+ * deps: finalhandler at 0.3.4
+ - deps: debug@~2.1.3
+ * deps: method-override@~2.3.2
+ - deps: debug@~2.1.3
+ * deps: morgan@~1.5.2
+ - deps: debug@~2.1.3
+ * deps: qs at 2.4.1
+ - Fix error when parameter `hasOwnProperty` is present
+ * deps: serve-index@~1.6.3
+ - Properly escape file names in HTML
+ - deps: accepts@~1.2.5
+ - deps: debug@~2.1.3
+ - deps: escape-html at 1.0.1
+ - deps: mime-types@~2.0.10
+ * deps: serve-static@~1.9.2
+ - deps: send at 0.12.2
+ * deps: type-is@~1.6.1
+ - deps: mime-types@~2.0.10
+
+2.29.0 / 2015-02-17
+===================
+
+ * Use `content-type` to parse `Content-Type` headers
+ * deps: body-parser@~1.12.0
+ - add `debug` messages
+ - accept a function for the `type` option
+ - make internal `extended: true` depth limit infinity
+ - use `content-type` to parse `Content-Type` headers
+ - deps: iconv-lite at 0.4.7
+ - deps: raw-body at 1.3.3
+ - deps: type-is@~1.6.0
+ * deps: compression@~1.4.1
+ - Prefer `gzip` over `deflate` on the server
+ - deps: accepts@~1.2.4
+ * deps: connect-timeout@~1.6.0
+ - deps: http-errors@~1.3.1
+ * deps: cookie-parser@~1.3.4
+ - deps: cookie-signature at 1.0.6
+ * deps: cookie-signature at 1.0.6
+ * deps: csurf@~1.7.0
+ - Accept `CSRF-Token` and `XSRF-Token` request headers
+ - Default `cookie.path` to `'/'`, if using cookies
+ - deps: cookie-signature at 1.0.6
+ - deps: csrf@~2.0.6
+ - deps: http-errors@~1.3.1
+ * deps: errorhandler@~1.3.4
+ - deps: accepts@~1.2.4
+ * deps: express-session@~1.10.3
+ - deps: cookie-signature at 1.0.6
+ - deps: uid-safe at 1.1.0
+ * deps: http-errors@~1.3.1
+ - Construct errors using defined constructors from `createError`
+ - Fix error names that are not identifiers
+ - Set a meaningful `name` property on constructed errors
+ * deps: response-time@~2.3.0
+ - Add function argument to support recording of response time
+ * deps: serve-index@~1.6.2
+ - deps: accepts@~1.2.4
+ - deps: http-errors@~1.3.1
+ - deps: mime-types@~2.0.9
+ * deps: serve-static@~1.9.1
+ - deps: send at 0.12.1
+ * deps: type-is@~1.6.0
+ - fix argument reassignment
+ - fix false-positives in `hasBody` `Transfer-Encoding` check
+ - support wildcard for both type and subtype (`*/*`)
+ - deps: mime-types@~2.0.9
+
+2.28.3 / 2015-01-31
+===================
+
+ * deps: compression@~1.3.1
+ - deps: accepts@~1.2.3
+ - deps: compressible@~2.0.2
+ * deps: csurf@~1.6.6
+ - deps: csrf@~2.0.5
+ * deps: errorhandler@~1.3.3
+ - deps: accepts@~1.2.3
+ * deps: express-session@~1.10.2
+ - deps: uid-safe at 1.0.3
+ * deps: serve-index@~1.6.1
+ - deps: accepts@~1.2.3
+ - deps: mime-types@~2.0.8
+ * deps: type-is@~1.5.6
+ - deps: mime-types@~2.0.8
+
+2.28.2 / 2015-01-20
+===================
+
+ * deps: body-parser@~1.10.2
+ - deps: iconv-lite at 0.4.6
+ - deps: raw-body at 1.3.2
+ * deps: serve-static@~1.8.1
+ - Fix redirect loop in Node.js 0.11.14
+ - Fix root path disclosure
+ - deps: send at 0.11.1
+
+2.28.1 / 2015-01-08
+===================
+
+ * deps: csurf@~1.6.5
+ - deps: csrf@~2.0.4
+ * deps: express-session@~1.10.1
+ - deps: uid-safe@~1.0.2
+
+2.28.0 / 2015-01-05
+===================
+
+ * deps: body-parser@~1.10.1
+ - Make internal `extended: true` array limit dynamic
+ - deps: on-finished@~2.2.0
+ - deps: type-is@~1.5.5
+ * deps: compression@~1.3.0
+ - Export the default `filter` function for wrapping
+ - deps: accepts@~1.2.2
+ - deps: debug@~2.1.1
+ * deps: connect-timeout@~1.5.0
+ - deps: debug@~2.1.1
+ - deps: http-errors@~1.2.8
+ - deps: ms at 0.7.0
+ * deps: csurf@~1.6.4
+ - deps: csrf@~2.0.3
+ - deps: http-errors@~1.2.8
+ * deps: debug@~2.1.1
+ * deps: errorhandler@~1.3.2
+ - Add `log` option
+ - Fix heading content to not include stack
+ - deps: accepts@~1.2.2
+ * deps: express-session@~1.10.0
+ - Add `store.touch` interface for session stores
+ - Fix `MemoryStore` expiration with `resave: false`
+ - deps: debug@~2.1.1
+ * deps: finalhandler at 0.3.3
+ - deps: debug@~2.1.1
+ - deps: on-finished@~2.2.0
+ * deps: method-override@~2.3.1
+ - deps: debug@~2.1.1
+ - deps: methods@~1.1.1
+ * deps: morgan@~1.5.1
+ - Add multiple date formats `clf`, `iso`, and `web`
+ - Deprecate `buffer` option
+ - Fix date format in `common` and `combined` formats
+ - Fix token arguments to accept values with `"`
+ - deps: debug@~2.1.1
+ - deps: on-finished@~2.2.0
+ * deps: serve-favicon@~2.2.0
+ - Support query string in the URL
+ - deps: etag@~1.5.1
+ - deps: ms at 0.7.0
+ * deps: serve-index@~1.6.0
+ - Add link to root directory
+ - deps: accepts@~1.2.2
+ - deps: batch at 0.5.2
+ - deps: debug@~2.1.1
+ - deps: mime-types@~2.0.7
+ * deps: serve-static@~1.8.0
+ - Fix potential open redirect when mounted at root
+ - deps: send at 0.11.0
+ * deps: type-is@~1.5.5
+ - deps: mime-types@~2.0.7
+
+2.27.6 / 2014-12-10
+===================
+
+ * deps: serve-index@~1.5.3
+ - deps: accepts@~1.1.4
+ - deps: http-errors@~1.2.8
+ - deps: mime-types@~2.0.4
+
+2.27.5 / 2014-12-10
+===================
+
+ * deps: compression@~1.2.2
+ - Fix `.end` to only proxy to `.end`
+ - deps: accepts@~1.1.4
+ * deps: express-session@~1.9.3
+ - Fix error when `req.sessionID` contains a non-string value
+ * deps: http-errors@~1.2.8
+ - Fix stack trace from exported function
+ - Remove `arguments.callee` usage
+ * deps: serve-index@~1.5.2
+ - Fix icon name background alignment on mobile view
+ * deps: type-is@~1.5.4
+ - deps: mime-types@~2.0.4
+
+2.27.4 / 2014-11-23
+===================
+
+ * deps: body-parser@~1.9.3
+ - deps: iconv-lite at 0.4.5
+ - deps: qs at 2.3.3
+ - deps: raw-body at 1.3.1
+ - deps: type-is@~1.5.3
+ * deps: compression@~1.2.1
+ - deps: accepts@~1.1.3
+ * deps: errorhandler@~1.2.3
+ - deps: accepts@~1.1.3
+ * deps: express-session@~1.9.2
+ - deps: crc at 3.2.1
+ * deps: qs at 2.3.3
+ - Fix `arrayLimit` behavior
+ * deps: serve-favicon@~2.1.7
+ - Avoid errors from enumerables on `Object.prototype`
+ * deps: serve-index@~1.5.1
+ - deps: accepts@~1.1.3
+ - deps: mime-types@~2.0.3
+ * deps: type-is@~1.5.3
+ - deps: mime-types@~2.0.3
+
+2.27.3 / 2014-11-09
+===================
+
+ * Correctly invoke async callback asynchronously
+ * deps: csurf@~1.6.3
+ - bump csrf
+ - bump http-errors
+
+2.27.2 / 2014-10-28
+===================
+
+ * Fix handling of URLs containing `://` in the path
+ * deps: body-parser@~1.9.2
+ - deps: qs at 2.3.2
+ * deps: qs at 2.3.2
+ - Fix parsing of mixed objects and values
+
+2.27.1 / 2014-10-22
+===================
+
+ * deps: body-parser@~1.9.1
+ - deps: on-finished@~2.1.1
+ - deps: qs at 2.3.0
+ - deps: type-is@~1.5.2
+ * deps: express-session@~1.9.1
+ - Remove unnecessary empty write call
+ * deps: finalhandler at 0.3.2
+ - deps: on-finished@~2.1.1
+ * deps: morgan@~1.4.1
+ - deps: on-finished@~2.1.1
+ * deps: qs at 2.3.0
+ - Fix parsing of mixed implicit and explicit arrays
+ * deps: serve-static@~1.7.1
+ - deps: send at 0.10.1
+
2.27.0 / 2014-10-16
===================
diff --git a/LICENSE b/LICENSE
index 6dd4c1c..9c27617 100644
--- a/LICENSE
+++ b/LICENSE
@@ -3,6 +3,7 @@
Copyright (c) 2010 Sencha Inc.
Copyright (c) 2011 LearnBoost
Copyright (c) 2011-2014 TJ Holowaychuk
+Copyright (c) 2015 Douglas Christopher Wilson
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
diff --git a/Readme.md b/Readme.md
index 530423b..74dc98f 100644
--- a/Readme.md
+++ b/Readme.md
@@ -4,89 +4,158 @@
[![NPM Downloads][downloads-image]][downloads-url]
[![Build Status][travis-image]][travis-url]
[![Test Coverage][coveralls-image]][coveralls-url]
-[![Gittip][gittip-image]][gittip-url]
+[![Gratipay][gratipay-image]][gratipay-url]
Connect is an extensible HTTP server framework for [node](http://nodejs.org) using "plugins" known as _middleware_.
```js
-var connect = require('connect')
-var http = require('http')
+var connect = require('connect');
+var http = require('http');
-var app = connect()
+var app = connect();
// gzip/deflate outgoing responses
-var compression = require('compression')
-app.use(compression())
+var compression = require('compression');
+app.use(compression());
// store session state in browser cookie
-var cookieSession = require('cookie-session')
+var cookieSession = require('cookie-session');
app.use(cookieSession({
keys: ['secret1', 'secret2']
-}))
+}));
// parse urlencoded request bodies into req.body
-var bodyParser = require('body-parser')
-app.use(bodyParser.urlencoded())
+var bodyParser = require('body-parser');
+app.use(bodyParser.urlencoded());
// respond to all requests
app.use(function(req, res){
res.end('Hello from Connect!\n');
-})
+});
//create node.js http server and listen on port
-http.createServer(app).listen(3000)
+http.createServer(app).listen(3000);
```
-## Connect 3.0
+## Getting Started
-Connect 3.0 is in progress in the `master` branch. The main changes in Connect are:
+Connect is a simple framework to glue together various "middleware" to handle requests.
-- Middleware will be moved to their own repositories in the [expressjs](http://github.com/expressjs) organization
-- All node patches will be removed - all middleware _should_ work without Connect and with similar frameworks like [restify](https://github.com/mcavage/node-restify)
-- Node `0.8` is no longer supported
-- The website documentation has been removed - view the markdown readmes instead
+### Install Connect
-If you would like to help maintain these middleware, please contact a [member of the expressjs team](https://github.com/orgs/expressjs/people).
+```sh
+$ npm install connect
+```
+
+### Create an app
+
+The main component is a Connect "app". This will store all the middleware
+added and is, itself, a function.
+
+```js
+var app = connect();
+```
+
+### Use middleware
+
+The core of Connect is "using" middleware. Middleware are added as a "stack"
+where incoming requests will execute each middleware one-by-one until a middleware
+does not call `next()` within it.
+
+```js
+app.use(function middleware1(req, res, next) {
+ // middleware 1
+ next();
+});
+app.use(function middleware2(req, res, next) {
+ // middleware 2
+ next();
+});
+```
+
+### Mount middleware
+
+The `.use()` method also takes an optional path string that is matched against
+the beginning of the incoming request URL. This allows for basic routing.
+
+```js
+app.use('/foo', function fooMiddleware(req, res, next) {
+ // req.url starts with "/foo"
+ next();
+});
+app.use('/bar', function barMiddleware(req, res, next) {
+ // req.url starts with "/bar"
+ next();
+});
+```
+
+### Error middleware
+
+There are special cases of "error-handling" middleware. There are middleware
+where the function takes exactly 4 arguments. Errors that occur in the middleware
+added before the error middleware will invoke this middleware when errors occur.
+
+```js
+app.use(function onerror(err, req, res, next) {
+ // an error occurred!
+});
+```
+
+### Create a server from the app
+
+The last step is to actually use the Connect app in a server. The `.listen()` method
+is a convenience to start a HTTP server.
+
+```js
+var server = app.listen(port);
+```
+
+The app itself is really just a function with three arguments, so it can also be handed
+to `.createServer()` in Node.js.
+
+```js
+var server = http.createServer(app);
+```
## Middleware
These middleware and libraries are officially supported by the Connect/Express team:
- - [body-parser](https://github.com/expressjs/body-parser) - previous `bodyParser`, `json`, and `urlencoded`. You may also be interested in:
- - [body](https://github.com/raynos/body)
- - [co-body](https://github.com/visionmedia/co-body)
- - [raw-body](https://github.com/stream-utils/raw-body)
- - [compression](https://github.com/expressjs/compression) - previously `compress`
- - [connect-timeout](https://github.com/expressjs/timeout) - previously `timeout`
- - [cookie-parser](https://github.com/expressjs/cookie-parser) - previously `cookieParser`
- - [cookie-session](https://github.com/expressjs/cookie-session) - previously `cookieSession`
- - [csurf](https://github.com/expressjs/csurf) - previously `csrf`
- - [errorhandler](https://github.com/expressjs/errorhandler) - previously `error-handler`
- - [express-session](https://github.com/expressjs/session) - previously `session`
- - [method-override](https://github.com/expressjs/method-override) - previously `method-override`
- - [morgan](https://github.com/expressjs/morgan) - previously `logger`
- - [response-time](https://github.com/expressjs/response-time) - previously `response-time`
- - [serve-favicon](https://github.com/expressjs/serve-favicon) - previously `favicon`
- - [serve-index](https://github.com/expressjs/serve-index) - previously `directory`
- - [serve-static](https://github.com/expressjs/serve-static) - previously `static`
- - [vhost](https://github.com/expressjs/vhost) - previously `vhost`
+ - [body-parser](https://www.npmjs.com/package/body-parser) - previous `bodyParser`, `json`, and `urlencoded`. You may also be interested in:
+ - [body](https://www.npmjs.com/package/body)
+ - [co-body](https://www.npmjs.com/package/co-body)
+ - [raw-body](https://www.npmjs.com/package/raw-body)
+ - [compression](https://www.npmjs.com/package/compression) - previously `compress`
+ - [connect-timeout](https://www.npmjs.com/package/connect-timeout) - previously `timeout`
+ - [cookie-parser](https://www.npmjs.com/package/cookie-parser) - previously `cookieParser`
+ - [cookie-session](https://www.npmjs.com/package/cookie-session) - previously `cookieSession`
+ - [csurf](https://www.npmjs.com/package/csurf) - previously `csrf`
+ - [errorhandler](https://www.npmjs.com/package/errorhandler) - previously `error-handler`
+ - [express-session](https://www.npmjs.com/package/express-session) - previously `session`
+ - [method-override](https://www.npmjs.com/package/method-override) - previously `method-override`
+ - [morgan](https://www.npmjs.com/package/morgan) - previously `logger`
+ - [response-time](https://www.npmjs.com/package/response-time) - previously `response-time`
+ - [serve-favicon](https://www.npmjs.com/package/serve-favicon) - previously `favicon`
+ - [serve-index](https://www.npmjs.com/package/serve-index) - previously `directory`
+ - [serve-static](https://www.npmjs.com/package/serve-static) - previously `static`
+ - [vhost](https://www.npmjs.com/package/vhost) - previously `vhost`
Most of these are exact ports of their Connect 2.x equivalents. The primary exception is `cookie-session`.
Some middleware previously included with Connect are no longer supported by the Connect/Express team, are replaced by an alternative module, or should be superseded by a better module. Use one of these alternatives instead:
- `cookieParser`
- - [cookies](https://github.com/jed/cookies) and [keygrip](https://github.com/jed/keygrip)
+ - [cookies](https://www.npmjs.com/package/cookies) and [keygrip](https://www.npmjs.com/package/keygrip)
- `limit`
- - [raw-body](https://github.com/stream-utils/raw-body)
+ - [raw-body](https://www.npmjs.com/package/raw-body)
- `multipart`
- - [connect-multiparty](https://github.com/superjoe30/connect-multiparty)
- - [connect-busboy](https://github.com/mscdex/connect-busboy)
+ - [connect-multiparty](https://www.npmjs.com/package/connect-multiparty)
+ - [connect-busboy](https://www.npmjs.com/package/connect-busboy)
- `query`
- - [qs](https://github.com/visionmedia/node-querystring)
+ - [qs](https://www.npmjs.com/package/qs)
- `staticCache`
- - [st](https://github.com/isaacs/st)
- - [connect-static](https://github.com/andrewrk/connect-static)
+ - [st](https://www.npmjs.com/package/st)
+ - [connect-static](https://www.npmjs.com/package/connect-static)
Checkout [http-framework](https://github.com/Raynos/http-framework/wiki/Modules) for many other compatible middleware!
@@ -107,19 +176,19 @@ npm test
- Connect `1.x` - node `0.4`
- Connect `< 2.8` - node `0.6`
- Connect `>= 2.8 < 3` - node `0.8`
- - Connect `>= 3` - node `0.10`
+ - Connect `>= 3` - node `0.10`, `0.12`; io.js `1.x`, `2.x`
## License
[MIT](LICENSE)
-[npm-image]: https://img.shields.io/npm/v/connect.svg?style=flat
+[npm-image]: https://img.shields.io/npm/v/connect.svg
[npm-url]: https://npmjs.org/package/connect
-[travis-image]: https://img.shields.io/travis/senchalabs/connect.svg?style=flat
+[travis-image]: https://img.shields.io/travis/senchalabs/connect/master.svg
[travis-url]: https://travis-ci.org/senchalabs/connect
-[coveralls-image]: https://img.shields.io/coveralls/senchalabs/connect.svg?style=flat
+[coveralls-image]: https://img.shields.io/coveralls/senchalabs/connect/master.svg
[coveralls-url]: https://coveralls.io/r/senchalabs/connect
-[downloads-image]: https://img.shields.io/npm/dm/connect.svg?style=flat
+[downloads-image]: https://img.shields.io/npm/dm/connect.svg
[downloads-url]: https://npmjs.org/package/connect
-[gittip-image]: https://img.shields.io/gittip/dougwilson.svg?style=flat
-[gittip-url]: https://www.gittip.com/dougwilson/
+[gratipay-image]: https://img.shields.io/gratipay/dougwilson.svg
+[gratipay-url]: https://www.gratipay.com/dougwilson/
diff --git a/index.js b/index.js
index 02befb4..6473a3a 100644
--- a/index.js
+++ b/index.js
@@ -1,2 +1,283 @@
+/*!
+ * connect
+ * Copyright(c) 2010 Sencha Inc.
+ * Copyright(c) 2011 TJ Holowaychuk
+ * Copyright(c) 2015 Douglas Christopher Wilson
+ * MIT Licensed
+ */
-module.exports = require('./lib/connect');
+'use strict';
+
+/**
+ * Module dependencies.
+ * @private
+ */
+
+var debug = require('debug')('connect:dispatcher');
+var EventEmitter = require('events').EventEmitter;
+var finalhandler = require('finalhandler');
+var http = require('http');
+var merge = require('utils-merge');
+var parseUrl = require('parseurl');
+
+/**
+ * Module exports.
+ * @public
+ */
+
+module.exports = createServer;
+
+/**
+ * Module variables.
+ * @private
+ */
+
+var env = process.env.NODE_ENV || 'development';
+var proto = {};
+
+/* istanbul ignore next */
+var defer = typeof setImmediate === 'function'
+ ? setImmediate
+ : function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) }
+
+/**
+ * Create a new connect server.
+ *
+ * @return {function}
+ * @public
+ */
+
+function createServer() {
+ function app(req, res, next){ app.handle(req, res, next); }
+ merge(app, proto);
+ merge(app, EventEmitter.prototype);
+ app.route = '/';
+ app.stack = [];
+ return app;
+}
+
+/**
+ * Utilize the given middleware `handle` to the given `route`,
+ * defaulting to _/_. This "route" is the mount-point for the
+ * middleware, when given a value other than _/_ the middleware
+ * is only effective when that segment is present in the request's
+ * pathname.
+ *
+ * For example if we were to mount a function at _/admin_, it would
+ * be invoked on _/admin_, and _/admin/settings_, however it would
+ * not be invoked for _/_, or _/posts_.
+ *
+ * @param {String|Function|Server} route, callback or server
+ * @param {Function|Server} callback or server
+ * @return {Server} for chaining
+ * @public
+ */
+
+proto.use = function use(route, fn) {
+ var handle = fn;
+ var path = route;
+
+ // default route to '/'
+ if (typeof route !== 'string') {
+ handle = route;
+ path = '/';
+ }
+
+ // wrap sub-apps
+ if (typeof handle.handle === 'function') {
+ var server = handle;
+ server.route = path;
+ handle = function (req, res, next) {
+ server.handle(req, res, next);
+ };
+ }
+
+ // wrap vanilla http.Servers
+ if (handle instanceof http.Server) {
+ handle = handle.listeners('request')[0];
+ }
+
+ // strip trailing slash
+ if (path[path.length - 1] === '/') {
+ path = path.slice(0, -1);
+ }
+
+ // add the middleware
+ debug('use %s %s', path || '/', handle.name || 'anonymous');
+ this.stack.push({ route: path, handle: handle });
+
+ return this;
+};
+
+/**
+ * Handle server requests, punting them down
+ * the middleware stack.
+ *
+ * @private
+ */
+
+proto.handle = function handle(req, res, out) {
+ var index = 0;
+ var protohost = getProtohost(req.url) || '';
+ var removed = '';
+ var slashAdded = false;
+ var stack = this.stack;
+
+ // final function handler
+ var done = out || finalhandler(req, res, {
+ env: env,
+ onerror: logerror
+ });
+
+ // store the original URL
+ req.originalUrl = req.originalUrl || req.url;
+
+ function next(err) {
+ if (slashAdded) {
+ req.url = req.url.substr(1);
+ slashAdded = false;
+ }
+
+ if (removed.length !== 0) {
+ req.url = protohost + removed + req.url.substr(protohost.length);
+ removed = '';
+ }
+
+ // next callback
+ var layer = stack[index++];
+
+ // all done
+ if (!layer) {
+ defer(done, err);
+ return;
+ }
+
+ // route data
+ var path = parseUrl(req).pathname || '/';
+ var route = layer.route;
+
+ // skip this layer if the route doesn't match
+ if (path.toLowerCase().substr(0, route.length) !== route.toLowerCase()) {
+ return next(err);
+ }
+
+ // skip if route match does not border "/", ".", or end
+ var c = path[route.length];
+ if (c !== undefined && '/' !== c && '.' !== c) {
+ return next(err);
+ }
+
+ // trim off the part of the url that matches the route
+ if (route.length !== 0 && route !== '/') {
+ removed = route;
+ req.url = protohost + req.url.substr(protohost.length + removed.length);
+
+ // ensure leading slash
+ if (!protohost && req.url[0] !== '/') {
+ req.url = '/' + req.url;
+ slashAdded = true;
+ }
+ }
+
+ // call the layer handle
+ call(layer.handle, route, err, req, res, next);
+ }
+
+ next();
+};
+
+/**
+ * Listen for connections.
+ *
+ * This method takes the same arguments
+ * as node's `http.Server#listen()`.
+ *
+ * HTTP and HTTPS:
+ *
+ * If you run your application both as HTTP
+ * and HTTPS you may wrap them individually,
+ * since your Connect "server" is really just
+ * a JavaScript `Function`.
+ *
+ * var connect = require('connect')
+ * , http = require('http')
+ * , https = require('https');
+ *
+ * var app = connect();
+ *
+ * http.createServer(app).listen(80);
+ * https.createServer(options, app).listen(443);
+ *
+ * @return {http.Server}
+ * @api public
+ */
+
+proto.listen = function listen() {
+ var server = http.createServer(this);
+ return server.listen.apply(server, arguments);
+};
+
+/**
+ * Invoke a route handle.
+ * @private
+ */
+
+function call(handle, route, err, req, res, next) {
+ var arity = handle.length;
+ var error = err;
+ var hasError = Boolean(err);
+
+ debug('%s %s : %s', handle.name || '<anonymous>', route, req.originalUrl);
+
+ try {
+ if (hasError && arity === 4) {
+ // error-handling middleware
+ handle(err, req, res, next);
+ return;
+ } else if (!hasError && arity < 4) {
+ // request-handling middleware
+ handle(req, res, next);
+ return;
+ }
+ } catch (e) {
+ // replace the error
+ error = e;
+ }
+
+ // continue
+ next(error);
+}
+
+/**
+ * Log error using console.error.
+ *
+ * @param {Error} err
+ * @private
+ */
+
+function logerror(err) {
+ if (env !== 'test') console.error(err.stack || err.toString());
+}
+
+/**
+ * Get get protocol + host for a URL.
+ *
+ * @param {string} url
+ * @private
+ */
+
+function getProtohost(url) {
+ if (url.length === 0 || url[0] === '/') {
+ return undefined;
+ }
+
+ var searchIndex = url.indexOf('?');
+ var pathLength = searchIndex !== -1
+ ? searchIndex
+ : url.length;
+ var fqdnIndex = url.substr(0, pathLength).indexOf('://');
+
+ return fqdnIndex !== -1
+ ? url.substr(0, url.indexOf('/', 3 + fqdnIndex))
+ : undefined;
+}
diff --git a/lib/connect.js b/lib/connect.js
deleted file mode 100644
index cc4cf35..0000000
--- a/lib/connect.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/*!
- * Connect
- * Copyright(c) 2010 Sencha Inc.
- * Copyright(c) 2011 TJ Holowaychuk
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var EventEmitter = require('events').EventEmitter;
-var merge = require('utils-merge');
-var proto = require('./proto');
-
-// expose createServer() as the module
-
-module.exports = createServer;
-
-/**
- * Create a new connect server.
- *
- * @return {Function}
- * @api public
- */
-
-function createServer() {
- function app(req, res, next){ app.handle(req, res, next); }
- merge(app, proto);
- merge(app, EventEmitter.prototype);
- app.route = '/';
- app.stack = [];
- return app;
-}
diff --git a/lib/proto.js b/lib/proto.js
deleted file mode 100644
index ab8d3a1..0000000
--- a/lib/proto.js
+++ /dev/null
@@ -1,226 +0,0 @@
-/*!
- * Connect - HTTPServer
- * Copyright(c) 2010 Sencha Inc.
- * Copyright(c) 2011 TJ Holowaychuk
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var finalhandler = require('finalhandler');
-var http = require('http');
-var debug = require('debug')('connect:dispatcher');
-var parseUrl = require('parseurl');
-
-// prototype
-
-var app = module.exports = {};
-
-// environment
-
-var env = process.env.NODE_ENV || 'development';
-
-/**
- * Utilize the given middleware `handle` to the given `route`,
- * defaulting to _/_. This "route" is the mount-point for the
- * middleware, when given a value other than _/_ the middleware
- * is only effective when that segment is present in the request's
- * pathname.
- *
- * For example if we were to mount a function at _/admin_, it would
- * be invoked on _/admin_, and _/admin/settings_, however it would
- * not be invoked for _/_, or _/posts_.
- *
- * @param {String|Function|Server} route, callback or server
- * @param {Function|Server} callback or server
- * @return {Server} for chaining
- * @api public
- */
-
-app.use = function(route, fn){
- // default route to '/'
- if ('string' != typeof route) {
- fn = route;
- route = '/';
- }
-
- // wrap sub-apps
- if ('function' == typeof fn.handle) {
- var server = fn;
- server.route = route;
- fn = function(req, res, next){
- server.handle(req, res, next);
- };
- }
-
- // wrap vanilla http.Servers
- if (fn instanceof http.Server) {
- fn = fn.listeners('request')[0];
- }
-
- // strip trailing slash
- if ('/' == route[route.length - 1]) {
- route = route.slice(0, -1);
- }
-
- // add the middleware
- debug('use %s %s', route || '/', fn.name || 'anonymous');
- this.stack.push({ route: route, handle: fn });
-
- return this;
-};
-
-/**
- * Handle server requests, punting them down
- * the middleware stack.
- *
- * @api private
- */
-
-app.handle = function(req, res, out) {
- var stack = this.stack
- , searchIndex = req.url.indexOf('?')
- , pathlength = searchIndex !== -1 ? searchIndex : req.url.length
- , fqdn = 1 + req.url.substr(0, pathlength).indexOf('://')
- , protohost = fqdn ? req.url.substr(0, req.url.indexOf('/', 2 + fqdn)) : ''
- , removed = ''
- , slashAdded = false
- , index = 0;
-
- // final function handler
- var done = out || finalhandler(req, res, {
- env: env,
- onerror: logerror
- });
-
- // store the original URL
- req.originalUrl = req.originalUrl || req.url;
-
- function next(err) {
- if (slashAdded) {
- req.url = req.url.substr(1);
- slashAdded = false;
- }
-
- if (removed.length !== 0) {
- req.url = protohost + removed + req.url.substr(protohost.length);
- removed = '';
- }
-
- // next callback
- var layer = stack[index++];
-
- // all done
- if (!layer) {
- done(err);
- return;
- }
-
- // route data
- var path = parseUrl(req).pathname || '/';
- var route = layer.route;
-
- // skip this layer if the route doesn't match
- if (path.toLowerCase().substr(0, route.length) !== route.toLowerCase()) {
- return next(err);
- }
-
- // skip if route match does not border "/", ".", or end
- var c = path[route.length];
- if (c !== undefined && '/' !== c && '.' !== c) {
- return next(err);
- }
-
- // trim off the part of the url that matches the route
- if (route.length !== 0 && route !== '/') {
- removed = route;
- req.url = protohost + req.url.substr(protohost.length + removed.length);
-
- // ensure leading slash
- if (!fqdn && req.url[0] !== '/') {
- req.url = '/' + req.url;
- slashAdded = true;
- }
- }
-
- // call the layer handle
- call(layer.handle, route, err, req, res, next);
- }
-
- next();
-};
-
-/**
- * Listen for connections.
- *
- * This method takes the same arguments
- * as node's `http.Server#listen()`.
- *
- * HTTP and HTTPS:
- *
- * If you run your application both as HTTP
- * and HTTPS you may wrap them individually,
- * since your Connect "server" is really just
- * a JavaScript `Function`.
- *
- * var connect = require('connect')
- * , http = require('http')
- * , https = require('https');
- *
- * var app = connect();
- *
- * http.createServer(app).listen(80);
- * https.createServer(options, app).listen(443);
- *
- * @return {http.Server}
- * @api public
- */
-
-app.listen = function(){
- var server = http.createServer(this);
- return server.listen.apply(server, arguments);
-};
-
-/**
- * Invoke a route handle.
- *
- * @api private
- */
-
-function call(handle, route, err, req, res, next) {
- var arity = handle.length;
- var hasError = Boolean(err);
-
- debug('%s %s : %s', handle.name || '<anonymous>', route, req.originalUrl);
-
- try {
- if (hasError && arity === 4) {
- // error-handling middleware
- handle(err, req, res, next);
- return;
- } else if (!hasError && arity < 4) {
- // request-handling middleware
- handle(req, res, next);
- return;
- }
- } catch (e) {
- // reset the error
- err = e;
- }
-
- // continue
- next(err);
-}
-
-/**
- * Log error using console.error.
- *
- * @param {Error} err
- * @api public
- */
-
-function logerror(err){
- if (env !== 'test') console.error(err.stack || err.toString());
-}
diff --git a/package.json b/package.json
index 538279e..d3da9a6 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "connect",
"description": "High performance middleware framework",
- "version": "3.3.0",
+ "version": "3.4.1",
"author": "TJ Holowaychuk <tj at vision-media.ca> (http://tjholowaychuk.com)",
"contributors": [
"Douglas Christopher Wilson <doug at somethingdoug.com>",
@@ -17,18 +17,23 @@
],
"repository": "senchalabs/connect",
"dependencies": {
- "debug": "~2.1.0",
- "finalhandler": "0.3.1",
- "parseurl": "~1.3.0",
+ "debug": "~2.2.0",
+ "finalhandler": "0.4.1",
+ "parseurl": "~1.3.1",
"utils-merge": "1.0.0"
},
"devDependencies": {
- "istanbul": "0.3.2",
- "mocha": "~1.21.4",
- "should": "~4.0.0",
- "supertest": "~0.14.0"
+ "istanbul": "0.4.2",
+ "mocha": "2.3.4",
+ "supertest": "1.1.0"
},
"license": "MIT",
+ "files": [
+ "LICENSE",
+ "History.md",
+ "Readme.md",
+ "index.js"
+ ],
"engines": {
"node": ">= 0.10.0"
},
diff --git a/test/fqdn.js b/test/fqdn.js
index c853ab5..bc5b276 100644
--- a/test/fqdn.js
+++ b/test/fqdn.js
@@ -32,6 +32,16 @@ describe('app.use()', function(){
.expect(200, '/?url=http://example.com/blog/post/1', done);
});
+ it('should ignore FQDN in path', function (done) {
+ app.use('/proxy', function (req, res) {
+ res.end(req.url);
+ });
+
+ rawrequest(app)
+ .get('/proxy/http://example.com/blog/post/1')
+ .expect(200, '/http://example.com/blog/post/1', done);
+ });
+
it('should adjust FQDN req.url', function(done){
app.use('/blog', function(req, res){
res.end(req.url);
@@ -78,7 +88,7 @@ function rawrequest(app) {
function expect(status, body, callback) {
server.listen(function(){
var addr = this.address();
- var hostname = addr.family === 'IPv6' ? '[::1]' : '127.0.0.1';
+ var hostname = addr.family === 'IPv6' ? '::1' : '127.0.0.1';
var port = addr.port;
var req = http.get({
diff --git a/test/mounting.js b/test/mounting.js
index 3bd14b1..4494e10 100644
--- a/test/mounting.js
+++ b/test/mounting.js
@@ -1,8 +1,8 @@
+var assert = require('assert');
var connect = require('..');
var http = require('http');
var request = require('supertest');
-var should = require('should');
describe('app.use()', function(){
var app;
@@ -63,7 +63,7 @@ describe('app.use()', function(){
it('should be case insensitive (lower-case route, mixed-case request)', function(done){
var blog = http.createServer(function(req, res){
- req.url.should.equal('/');
+ assert.equal(req.url, '/');
res.end('blog');
});
@@ -76,7 +76,7 @@ describe('app.use()', function(){
it('should be case insensitive (mixed-case route, lower-case request)', function(done){
var blog = http.createServer(function(req, res){
- req.url.should.equal('/');
+ assert.equal(req.url, '/');
res.end('blog');
});
@@ -89,7 +89,7 @@ describe('app.use()', function(){
it('should be case insensitive (mixed-case route, mixed-case request)', function(done){
var blog = http.createServer(function(req, res){
- req.url.should.equal('/');
+ assert.equal(req.url, '/');
res.end('blog');
});
@@ -126,7 +126,7 @@ describe('app.use()', function(){
var blog = connect();
blog.use(function(req, res){
- req.url.should.equal('/');
+ assert.equal(req.url, '/');
res.end('blog');
});
@@ -163,7 +163,7 @@ describe('app.use()', function(){
var blog = connect();
blog.use(function(req, res){
- req.url.should.equal('/');
+ assert.equal(req.url, '/');
res.end('blog');
});
@@ -179,9 +179,9 @@ describe('app.use()', function(){
var admin = connect();
app.use('/blog', blog);
blog.use('/admin', admin);
- app.route.should.equal('/');
- blog.route.should.equal('/blog');
- admin.route.should.equal('/admin');
+ assert.equal(app.route, '/');
+ assert.equal(blog.route, '/blog');
+ assert.equal(admin.route, '/admin');
});
it('should not add trailing slash to req.url', function(done) {
@@ -202,7 +202,7 @@ describe('app.use()', function(){
describe('with a node app', function(){
it('should mount', function(done){
var blog = http.createServer(function(req, res){
- req.url.should.equal('/');
+ assert.equal(req.url, '/');
res.end('blog');
});
diff --git a/test/server.js b/test/server.js
index 32f72ae..00871f8 100644
--- a/test/server.js
+++ b/test/server.js
@@ -3,7 +3,6 @@ var assert = require('assert');
var connect = require('..');
var http = require('http');
var request = require('supertest');
-var should = require('should');
describe('app', function(){
var app;
@@ -17,6 +16,81 @@ describe('app', function(){
app.emit('foo');
});
+ it('should work in http.createServer', function(done){
+ var app = connect();
+
+ app.use(function (req, res) {
+ res.end('hello, world!');
+ });
+
+ var server = http.createServer(app);
+
+ request(server)
+ .get('/')
+ .expect(200, 'hello, world!', done);
+ })
+
+ it('should be a callable function', function(done){
+ var app = connect();
+
+ app.use(function (req, res) {
+ res.end('hello, world!');
+ });
+
+ function handler(req, res) {
+ res.write('oh, ');
+ app(req, res);
+ }
+
+ var server = http.createServer(handler);
+
+ request(server)
+ .get('/')
+ .expect(200, 'oh, hello, world!', done);
+ })
+
+ it('should invoke callback if request not handled', function(done){
+ var app = connect();
+
+ app.use('/foo', function (req, res) {
+ res.end('hello, world!');
+ });
+
+ function handler(req, res) {
+ res.write('oh, ');
+ app(req, res, function() {
+ res.end('no!');
+ });
+ }
+
+ var server = http.createServer(handler);
+
+ request(server)
+ .get('/')
+ .expect(200, 'oh, no!', done);
+ })
+
+ it('should invoke callback on error', function(done){
+ var app = connect();
+
+ app.use(function (req, res) {
+ throw new Error('boom!');
+ });
+
+ function handler(req, res) {
+ res.write('oh, ');
+ app(req, res, function(err) {
+ res.end(err.message);
+ });
+ }
+
+ var server = http.createServer(handler);
+
+ request(server)
+ .get('/')
+ .expect(200, 'oh, boom!', done);
+ })
+
it('should work as middleware', function(done){
// custom server handler array
var handlers = [connect(), function(req, res, next){
@@ -35,22 +109,11 @@ describe('app', function(){
}
// create a non-connect server
- var server = http.createServer(run).listen(5556, function(){
- http.get({
- host: 'localhost',
- port: 5556,
- path: '/'
- }, function(res){
- var buf = '';
- res.setEncoding('utf8');
- res.on('data', function(s){ buf += s });
- res.on('end', function(){
- buf.should.eql('Ok');
- server.close();
- done();
- });
- });
- });
+ var server = http.createServer(run);
+
+ request(server)
+ .get('/')
+ .expect(200, 'Ok', done);
});
it('should escape the 500 response body', function(done){
@@ -171,7 +234,7 @@ function rawrequest(app) {
function expect(status, body, callback) {
server.listen(function(){
var addr = this.address();
- var hostname = addr.family === 'IPv6' ? '[::1]' : '127.0.0.1';
+ var hostname = addr.family === 'IPv6' ? '::1' : '127.0.0.1';
var port = addr.port;
var req = http.get({
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/node-connect.git
More information about the Pkg-javascript-commits
mailing list