From c8801e6e5698dd8082134d75be706c618fa1989b Mon Sep 17 00:00:00 2001 From: Jonathan Ong Date: Mon, 6 Jan 2014 00:26:47 -0800 Subject: [PATCH] remove examples sorry. need to go into their own repos. --- examples/basicAuth.js | 35 ------- examples/cookieSession.js | 41 -------- examples/csrf.js | 36 ------- examples/directory.js | 12 --- examples/error.js | 19 ---- examples/favicon.js | 12 --- examples/helloworld.js | 12 --- examples/logger.fast.js | 14 --- examples/logger.format.js | 62 ------------ examples/logger.js | 14 --- examples/mounting.js | 33 ------- examples/profiler.js | 17 ---- examples/public/tobi.jpeg | Bin 36906 -> 0 bytes examples/rollingSession.js | 64 ------------ examples/session.js | 198 ------------------------------------- examples/static.js | 14 --- examples/vhost.js | 31 ------ 17 files changed, 614 deletions(-) delete mode 100644 examples/basicAuth.js delete mode 100644 examples/cookieSession.js delete mode 100644 examples/csrf.js delete mode 100644 examples/directory.js delete mode 100644 examples/error.js delete mode 100644 examples/favicon.js delete mode 100644 examples/helloworld.js delete mode 100644 examples/logger.fast.js delete mode 100644 examples/logger.format.js delete mode 100644 examples/logger.js delete mode 100644 examples/mounting.js delete mode 100644 examples/profiler.js delete mode 100644 examples/public/tobi.jpeg delete mode 100644 examples/rollingSession.js delete mode 100644 examples/session.js delete mode 100644 examples/static.js delete mode 100644 examples/vhost.js diff --git a/examples/basicAuth.js b/examples/basicAuth.js deleted file mode 100644 index 514407bc1..000000000 --- a/examples/basicAuth.js +++ /dev/null @@ -1,35 +0,0 @@ - -/** - * Module dependencies. - */ - -var connect = require('../'); - -function auth(user, pass) { - return 'tj' == user && 'tobi' == pass; -} - -function authorized(req, res) { - res.end('authorized!'); -} - -function hello(req, res) { - res.end('hello! try /admin'); -} - -// apply globally - -connect( - connect.basicAuth(auth) - , authorized -).listen(3000); - -// apply to /admin/* only - -var server = connect(); - -server.use('/admin', connect.basicAuth(auth)); -server.use('/admin', authorized); -server.use(hello); - -server.listen(3001); \ No newline at end of file diff --git a/examples/cookieSession.js b/examples/cookieSession.js deleted file mode 100644 index 1cb6cdc25..000000000 --- a/examples/cookieSession.js +++ /dev/null @@ -1,41 +0,0 @@ - -var connect = require('../') - , http = require('http'); - -var app = connect() - .use(connect.logger('dev')) - .use(connect.bodyParser()) - .use(connect.cookieParser()) - .use(connect.cookieSession({ secret: 'some secret' })) - .use(post) - .use(clear) - .use(counter); - -function clear(req, res, next) { - if ('/clear' != req.url) return next(); - req.session = null; - res.statusCode = 302; - res.setHeader('Location', '/'); - res.end(); -} - -function post(req, res, next) { - if ('POST' != req.method) return next(); - req.session.name = req.body.name; - next(); -} - -function counter(req, res) { - req.session.count = req.session.count || 0; - var n = req.session.count++; - var name = req.session.name || 'Enter your name'; - res.end('

hits: ' + n + '

' - + '
' - + '

' - + '

' - + '
' - + '

clear session

'); -} - -http.createServer(app).listen(3000); -console.log('Server listening on port 3000'); diff --git a/examples/csrf.js b/examples/csrf.js deleted file mode 100644 index 8c54c139f..000000000 --- a/examples/csrf.js +++ /dev/null @@ -1,36 +0,0 @@ - -/** - * Module dependencies. - */ - -var connect = require('../') - , http = require('http'); - -var form = '\n\ -
\n\ - \n\ - \n\ - \n\ -
\n\ -'; - -var app = connect() - .use(connect.cookieParser()) - .use(connect.session({ secret: 'keyboard cat' })) - .use(connect.bodyParser()) - .use(connect.csrf()) - .use(function(req, res, next){ - if ('POST' != req.method) return next(); - req.session.user = req.body.user; - next(); - }) - .use(function(req, res){ - res.setHeader('Content-Type', 'text/html'); - var body = form - .replace('{token}', req.csrfToken()) - .replace('{user}', req.session.user && req.session.user.name || ''); - res.end(body); - }); - -http.createServer(app).listen(3000); -console.log('Server listening on port 3000'); diff --git a/examples/directory.js b/examples/directory.js deleted file mode 100644 index 227384762..000000000 --- a/examples/directory.js +++ /dev/null @@ -1,12 +0,0 @@ - -/** - * Module dependencies. - */ - -var connect = require('../'); -var app = connect(); -var path = __dirname + '/../'; - -app.use(connect.directory(path, { icons: true })) -app.use(connect.static(path)) -app.listen(3000); diff --git a/examples/error.js b/examples/error.js deleted file mode 100644 index a750c5e86..000000000 --- a/examples/error.js +++ /dev/null @@ -1,19 +0,0 @@ - -var connect = require('../') - , http = require('http'); - -// try: -// - viewing in a browser -// - curl http://localhost:3000 -// - curl -H "Accept: application/json" http://localhost:3000 - -var app = connect() - .use(function(req, res, next){ - var err = new Error('oh noes!'); - err.number = 7; - throw err; - }) - .use(connect.errorHandler()); - -http.Server(app).listen(3000); -console.log('Server started on port 3000'); diff --git a/examples/favicon.js b/examples/favicon.js deleted file mode 100644 index 6305b2021..000000000 --- a/examples/favicon.js +++ /dev/null @@ -1,12 +0,0 @@ - -/** - * Module dependencies. - */ - -var connect = require('../'); - -// $ curl -i http://localhost:3000/favicon.ico - -connect.createServer( - connect.favicon() -).listen(3000); \ No newline at end of file diff --git a/examples/helloworld.js b/examples/helloworld.js deleted file mode 100644 index 3a0240c05..000000000 --- a/examples/helloworld.js +++ /dev/null @@ -1,12 +0,0 @@ - -/** - * Module dependencies. - */ - -var connect = require('../'); - -connect.createServer(function(req, res){ - var body = 'Hello World'; - res.setHeader('Content-Length', body.length); - res.end(body); -}).listen(3000); \ No newline at end of file diff --git a/examples/logger.fast.js b/examples/logger.fast.js deleted file mode 100644 index 3ddb7c8d6..000000000 --- a/examples/logger.fast.js +++ /dev/null @@ -1,14 +0,0 @@ - -/** - * Module dependencies. - */ - -var connect = require('../'); - -// $ curl -i http://localhost:3000/favicon.ico -// true defaults to 1000ms - -connect.createServer( - connect.logger({ buffer: 5000 }) - , connect.favicon() -).listen(3000); \ No newline at end of file diff --git a/examples/logger.format.js b/examples/logger.format.js deleted file mode 100644 index c30a484d4..000000000 --- a/examples/logger.format.js +++ /dev/null @@ -1,62 +0,0 @@ - -/** - * Module dependencies. - */ - -var connect = require('../'); - -// $ curl http://localhost:3000/ - -// custom format string - -connect.createServer( - connect.logger(':method :url - :res[content-type]') - , function(req, res){ - res.statusCode = 500; - res.setHeader('Content-Type', 'text/plain'); - res.end('Internal Server Error'); - } -).listen(3000); - -// $ curl http://localhost:3001/ -// $ curl http://localhost:3001/302 -// $ curl http://localhost:3001/404 -// $ curl http://localhost:3001/500 - -connect() - .use(connect.logger('dev')) - .use('/connect', connect.static(__dirname + '/lib')) - .use('/connect', connect.directory(__dirname + '/lib')) - .use(function(req, res, next){ - switch (req.url) { - case '/500': - var body = 'Internal Server Error'; - res.statusCode = 500; - res.setHeader('Content-Length', body.length); - res.end(body); - break; - case '/404': - var body = 'Not Found'; - res.statusCode = 404; - res.setHeader('Content-Length', body.length); - res.end(body); - break; - case '/302': - var body = 'Found'; - res.statusCode = 302; - res.setHeader('Content-Length', body.length); - res.end(body); - break; - default: - var body = 'OK'; - res.setHeader('Content-Length', body.length); - res.end(body); - } - }) - .listen(3001); - -// pre-defined - -connect() - .use(connect.logger('short')) - .listen(3002); \ No newline at end of file diff --git a/examples/logger.js b/examples/logger.js deleted file mode 100644 index 33df13066..000000000 --- a/examples/logger.js +++ /dev/null @@ -1,14 +0,0 @@ - -/** - * Module dependencies. - */ - -var connect = require('../'); - -// $ curl http://localhost:3000/favicon.ico - -connect.createServer( - connect.logger() - , connect.favicon() -).listen(3000); - diff --git a/examples/mounting.js b/examples/mounting.js deleted file mode 100644 index 3506bf7ff..000000000 --- a/examples/mounting.js +++ /dev/null @@ -1,33 +0,0 @@ - -/** - * Module dependencies. - */ - -var connect = require('../'); - -var blog = connect( - connect.router(function(app){ - app.get('/', function(req, res){ - res.end('list blog posts. try /post/0'); - }); - - app.get('/post/:id', function(req, res){ - res.end('got post ' + req.params.id); - }); - }) -); - -var admin = connect( - connect.basicAuth(function(user, pass){ return 'tj' == user && 'tobi' == pass }) - , function(req, res){ - res.end('admin stuff'); - } -); - -connect() - .use('/admin', admin) - .use('/blog', blog) - .use(function(req, res){ - res.end('try /blog, /admin, or /blog/post/0'); - }) - .listen(3000); \ No newline at end of file diff --git a/examples/profiler.js b/examples/profiler.js deleted file mode 100644 index 5e5803aef..000000000 --- a/examples/profiler.js +++ /dev/null @@ -1,17 +0,0 @@ - -/** - * Module dependencies. - */ - -var connect = require('../'); - -// $ curl -i http://localhost:3000/ - -connect( - connect.profiler() - , connect.favicon() - , connect.static(__dirname) - , function(req, res, next){ - res.end('hello world'); - } -).listen(3000); diff --git a/examples/public/tobi.jpeg b/examples/public/tobi.jpeg deleted file mode 100644 index 0d61e3461891a09c17ec95fc7329cda68db85ab9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36906 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 diff --git a/examples/rollingSession.js b/examples/rollingSession.js deleted file mode 100644 index 0c2e32cc1..000000000 --- a/examples/rollingSession.js +++ /dev/null @@ -1,64 +0,0 @@ - -var connect = require('../') -var http = require('http'); - -var hour = 60 * 60 * 1000; - -// maxAge session without the rolling option -// it doesn't update the maxAge value - -http.createServer(connect() - .use(connect.cookieParser()) - .use(connect.session({ secret : 'keyboard cat', - key : 'NoRolling.sid', - cookie : { maxAge: hour }})) - .use(connect.favicon()) - .use(clear) - .use(change) - .use(counter) - ).listen(3000); -console.log('port 3000: without rolling, session CANNOT be changed to browser session'); - -// maxAge session with the rolling option -// it always updates the maxAge value - -http.createServer(connect() - .use(connect.cookieParser()) - .use(connect.session({ secret : 'keyboard cat', - key : 'Rolling.sid', - cookie : { maxAge: hour }, - rolling : true})) - .use(connect.favicon()) - .use(clear) - .use(change) - .use(counter) - ).listen(3001); -console.log('port 3001: with rolling, session CAN be changed to browser session'); - -function clear(req, res, next) { - if ('/clear' != req.url) return next(); - req.session.regenerate(function(err){}); - res.statusCode = 302; - res.setHeader('Location', '/'); - res.end(); -} -function change(req, res, next) { - if ('/change' != req.url) return next(); - req.session.cookie.maxAge = req.session.cookie.maxAge ? null : hour; - res.statusCode = 302; - res.setHeader('Location', '/'); - res.end(); -} -function counter(req, res) { - req.session.count = req.session.count || 0; - var n = req.session.count++; - var expiration = req.session.cookie.maxAge - ? req.session.cookie.maxAge + "msec" - : "browser session"; - res.end('

Expiration: ' + expiration + '

' - + '

Hits: ' + n + '

' - + '

clear session

' - + (req.session.cookie.maxAge - ? '

Change to Browser Session

' - : '

Change to maxAge Session

')); -} diff --git a/examples/session.js b/examples/session.js deleted file mode 100644 index 3db8a59ef..000000000 --- a/examples/session.js +++ /dev/null @@ -1,198 +0,0 @@ - -var connect = require('../') - , http = require('http'); - -var year = 31557600000; - -// large max-age, delegate expiry to the session store. -// for example with connect-redis's .ttl option. - -http.createServer(connect() - .use(connect.cookieParser()) - .use(connect.session({ secret: 'keyboard cat', cookie: { maxAge: year }})) - .use(connect.favicon()) - .use(function(req, res, next){ - var sess = req.session; - if (sess.views) { - sess.views++; - res.setHeader('Content-Type', 'text/html'); - res.write('

views: ' + sess.views + '

'); - res.write('

expires in: ' + (sess.cookie.maxAge / 1000) + 's

'); - res.end(); - } else { - sess.views = 1; - res.end('welcome to the session demo. refresh!'); - } - })).listen(3007); - -console.log('port 3007: 1 minute expiration demo'); - - -// expire sessions within a minute -// /favicon.ico is ignored, and will not -// receive req.session - -http.createServer(connect() - .use(connect.cookieParser()) - .use(connect.session({ secret: 'keyboard cat', cookie: { maxAge: 60000 }})) - .use(connect.favicon()) - .use(function(req, res, next){ - var sess = req.session; - if (sess.views) { - sess.views++; - res.setHeader('Content-Type', 'text/html'); - res.write('

views: ' + sess.views + '

'); - res.write('

expires in: ' + (sess.cookie.maxAge / 1000) + 's

'); - res.end(); - } else { - sess.views = 1; - res.end('welcome to the session demo. refresh!'); - } - })).listen(3006); - -console.log('port 3006: 1 minute expiration demo'); - -// $ npm install connect-redis - -try { - var RedisStore = require('connect-redis')(connect); - http.createServer(connect() - .use(connect.cookieParser()) - .use(connect.session({ - secret: 'keyboard cat', - cookie: { maxAge: 60000 * 3 } - , store: new RedisStore - })) - .use(connect.favicon()) - .use(function(req, res, next){ - var sess = req.session; - if (sess.views) { - sess.views++; - res.setHeader('Content-Type', 'text/html'); - res.end('

views: ' + sess.views + '

'); - } else { - sess.views = 1; - res.end('welcome to the redis demo. refresh!'); - } - })).listen(3001); - - console.log('port 3001: redis example'); -} catch (err) { - console.log('\033[33m'); - console.log('failed to start the Redis example.'); - console.log('to try it install redis, start redis'); - console.log('install connect-redis, and run this'); - console.log('script again.'); - console.log(' $ redis-server'); - console.log(' $ npm install connect-redis'); - console.log('\033[0m'); -} - -// conditional session support by simply -// wrapping middleware with middleware. - -var sess = connect.session({ secret: 'keyboard cat', cookie: { maxAge: 5000 }}); - -http.createServer(connect() - .use(connect.cookieParser()) - .use(function(req, res, next){ - if ('/foo' == req.url || '/bar' == req.url) { - sess(req, res, next); - } else { - next(); - } - }) - .use(connect.favicon()) - .use(function(req, res, next){ - res.end('has session: ' + (req.session ? 'yes' : 'no')); - })).listen(3002); - -console.log('port 3002: conditional sessions'); - -// Session#reload() will update req.session -// without altering .maxAge - -// view the page several times, and see that the -// setInterval can still gain access to new -// session data - -http.createServer(connect() - .use(connect.cookieParser()) - .use(connect.session({ secret: 'keyboard cat', cookie: { maxAge: 60000 }})) - .use(connect.favicon()) - .use(function(req, res, next){ - var sess = req.session - , prev; - - if (sess.views) { - res.setHeader('Content-Type', 'text/html'); - res.write('

views: ' + sess.views + '

'); - res.write('

expires in: ' + (sess.cookie.maxAge / 1000) + 's

'); - sess.views++; - res.end(); - } else { - sess.views = 1; - setInterval(function(){ - sess.reload(function(){ - console.log(); - if (prev) console.log('previous views %d, now %d', prev, req.session.views); - console.log('time remaining until expiry: %ds', (req.session.cookie.maxAge / 1000)); - prev = req.session.views; - }); - }, 3000); - res.end('welcome to the session demo. refresh!'); - } - })).listen(3003); - -console.log('port 3003: Session#reload() demo'); - -// by default sessions -// last the duration of -// a user-agent's own session, -// aka while the browser is open. - -http.createServer(connect() - .use(connect.cookieParser()) - .use(connect.session({ secret: 'keyboard cat' })) - .use(connect.favicon()) - .use(function(req, res, next){ - var sess = req.session; - if (sess.views) { - res.setHeader('Content-Type', 'text/html'); - res.write('

views: ' + sess.views + '

'); - res.end(); - sess.views++; - } else { - sess.views = 1; - res.end('welcome to the browser session demo. refresh!'); - } - })).listen(3004); - -console.log('port 3004: browser-session length sessions'); - -// persistence example, enter your name! - -http.createServer(connect() - .use(connect.bodyParser()) - .use(connect.cookieParser()) - .use(connect.session({ secret: 'keyboard cat' })) - .use(connect.favicon()) - .use(function(req, res, next){ - if ('POST' != req.method) return next(); - req.session.name = req.body.name; - res.statusCode = 302; - res.setHeader('Location', '/'); - res.end(); - }) - .use(function(req, res, next){ - var sess = req.session; - res.setHeader('Content-Type', 'text/html'); - if (sess.name) res.write('

Hey ' + sess.name + '!

'); - else res.write('

Enter a username:

'); - res.end('
' - + '' - + '' - + '
'); - })).listen(3005); - -console.log('port 3005: browser-session length sessions persistence example'); diff --git a/examples/static.js b/examples/static.js deleted file mode 100644 index cf5c22528..000000000 --- a/examples/static.js +++ /dev/null @@ -1,14 +0,0 @@ - -/** - * Module dependencies. - */ - -var connect = require('../'); - -connect( - connect.static(__dirname + '/public', { maxAge: 0 }) - , function(req, res) { - res.setHeader('Content-Type', 'text/html'); - res.end('') - } -).listen(3000); \ No newline at end of file diff --git a/examples/vhost.js b/examples/vhost.js deleted file mode 100644 index 1f28c56f6..000000000 --- a/examples/vhost.js +++ /dev/null @@ -1,31 +0,0 @@ - -/** - * Module dependencies. - */ - -var connect = require('../'); - -var account = connect(function(req, res){ - var location = 'http://localhost:3000/account/' + req.headers.host.split('.localhost')[0]; - res.statusCode = 302; - res.setHeader('Location', location); - res.end('Moved to ' + location); -}); - -var blog = connect(function(req, res){ - res.end('blog app'); -}); - -var main = connect(function(req, res){ - if (req.url == '/') return res.end('main app'); - if (0 == req.url.indexOf('/account/')) return res.end('viewing user account for ' + req.url.substring(9)); - res.statusCode = 404; - res.end(); -}); - -connect( - connect.logger() - , connect.vhost('blog.localhost', blog) - , connect.vhost('*.localhost', account) - , main -).listen(3000);