vulcan 0.2.5 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (211) hide show
  1. data/README.md +1 -80
  2. data/lib/vulcan/cli.rb +12 -33
  3. data/lib/vulcan/version.rb +1 -1
  4. data/server/bin/make +3 -1
  5. data/server/lib/spawner.js +4 -9
  6. data/server/node_modules/connect-form/node_modules/formidable/Readme.md +2 -13
  7. data/server/node_modules/connect-form/node_modules/formidable/lib/incoming_form.js +7 -19
  8. data/server/node_modules/connect-form/node_modules/formidable/lib/multipart_parser.js +1 -12
  9. data/server/node_modules/connect-form/node_modules/formidable/package.json +1 -1
  10. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/http/special-chars-in-filename/osx-chrome-13.http +10 -0
  11. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-chrome-12.http +9 -0
  12. data/server/node_modules/connect-form/node_modules/formidable/test/legacy/simple/test-multipart-parser.js +1 -1
  13. data/server/node_modules/cradle/lib/cradle.js +1 -0
  14. data/server/node_modules/cradle/node_modules/vows/LICENSE +20 -0
  15. data/server/node_modules/cradle/node_modules/vows/Makefile +7 -0
  16. data/server/node_modules/cradle/node_modules/vows/README.md +39 -0
  17. data/server/node_modules/cradle/node_modules/vows/bin/vows +515 -0
  18. data/server/node_modules/cradle/node_modules/vows/lib/assert/error.js +27 -0
  19. data/server/node_modules/cradle/node_modules/vows/lib/assert/macros.js +215 -0
  20. data/server/node_modules/cradle/node_modules/vows/lib/assert/utils.js +77 -0
  21. data/server/node_modules/cradle/node_modules/vows/lib/vows.js +193 -0
  22. data/server/node_modules/cradle/node_modules/vows/lib/vows/console.js +131 -0
  23. data/server/node_modules/cradle/node_modules/vows/lib/vows/context.js +55 -0
  24. data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/file.js +29 -0
  25. data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/fragments/coverage-foot.html +2 -0
  26. data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/fragments/coverage-head.html +61 -0
  27. data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/report-html.js +54 -0
  28. data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/report-json.js +54 -0
  29. data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/report-plain.js +38 -0
  30. data/server/node_modules/cradle/node_modules/vows/lib/vows/extras.js +28 -0
  31. data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/dot-matrix.js +67 -0
  32. data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/json.js +16 -0
  33. data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/silent.js +8 -0
  34. data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/spec.js +44 -0
  35. data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/watch.js +39 -0
  36. data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/xunit.js +90 -0
  37. data/server/node_modules/cradle/node_modules/vows/lib/vows/suite.js +319 -0
  38. data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/LICENSE +20 -0
  39. data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/Makefile +4 -0
  40. data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/README.md +72 -0
  41. data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/lib/eyes.js +233 -0
  42. data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/package.json +14 -0
  43. data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/test/eyes-test.js +55 -0
  44. data/server/node_modules/cradle/node_modules/vows/package.json +14 -0
  45. data/server/node_modules/cradle/node_modules/vows/test/assert-test.js +135 -0
  46. data/server/node_modules/cradle/node_modules/vows/test/fixtures/isolate/failing.js +18 -0
  47. data/server/node_modules/cradle/node_modules/vows/test/fixtures/isolate/log.js +18 -0
  48. data/server/node_modules/cradle/node_modules/vows/test/fixtures/isolate/passing.js +17 -0
  49. data/server/node_modules/cradle/node_modules/vows/test/fixtures/isolate/stderr.js +18 -0
  50. data/server/node_modules/cradle/node_modules/vows/test/isolate-test.js +140 -0
  51. data/server/node_modules/cradle/node_modules/vows/test/testInherit.js +133 -0
  52. data/server/node_modules/cradle/node_modules/vows/test/vows-error-test.js +51 -0
  53. data/server/node_modules/cradle/node_modules/vows/test/vows-test.js +374 -0
  54. data/server/node_modules/cradle/package.json +3 -3
  55. data/server/node_modules/cradle/test/cache-test.js +7 -6
  56. data/server/node_modules/cradle/test/cradle-test.js +5 -4
  57. data/server/node_modules/cradle/test/response-test.js +6 -5
  58. data/server/node_modules/express/History.md +1 -53
  59. data/server/node_modules/express/Makefile +9 -3
  60. data/server/node_modules/express/Readme.md +1 -3
  61. data/server/node_modules/express/bin/express +66 -65
  62. data/server/node_modules/express/lib/express.js +1 -1
  63. data/server/node_modules/express/lib/request.js +9 -23
  64. data/server/node_modules/express/lib/response.js +2 -3
  65. data/server/node_modules/express/lib/utils.js +0 -13
  66. data/server/node_modules/express/lib/view.js +16 -19
  67. data/server/node_modules/express/lib/view/view.js +1 -2
  68. data/server/node_modules/express/node_modules/connect/lib/connect.js +1 -1
  69. data/server/node_modules/express/node_modules/connect/lib/http.js +0 -2
  70. data/server/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js +31 -135
  71. data/server/node_modules/express/node_modules/connect/lib/middleware/limit.js +1 -5
  72. data/server/node_modules/express/node_modules/connect/lib/middleware/session.js +2 -2
  73. data/server/node_modules/express/node_modules/connect/lib/middleware/static.js +21 -26
  74. data/server/node_modules/express/node_modules/connect/lib/middleware/staticCache.js +38 -91
  75. data/server/node_modules/express/node_modules/connect/lib/middleware/vhost.js +1 -1
  76. data/server/node_modules/express/node_modules/connect/lib/utils.js +4 -11
  77. data/server/node_modules/express/node_modules/connect/package.json +6 -7
  78. data/server/node_modules/express/node_modules/connect/test.js +31 -44
  79. data/server/node_modules/express/node_modules/mime/index.js +1 -0
  80. data/server/node_modules/express/node_modules/mime/mime.js +3 -3
  81. data/server/node_modules/express/node_modules/mime/{types/mime.types → mime.types} +0 -0
  82. data/server/node_modules/express/node_modules/mime/{types/node.types → node.types} +0 -17
  83. data/server/node_modules/express/node_modules/mime/package.json +10 -21
  84. data/server/node_modules/express/node_modules/mime/test.js +3 -2
  85. data/server/node_modules/express/node_modules/qs/History.md +0 -11
  86. data/server/node_modules/express/node_modules/qs/Makefile +3 -1
  87. data/server/node_modules/express/node_modules/qs/Readme.md +4 -2
  88. data/server/node_modules/express/node_modules/qs/lib/querystring.js +74 -100
  89. data/server/node_modules/express/node_modules/qs/package.json +2 -9
  90. data/server/node_modules/express/node_modules/qs/support/expresso/History.md +128 -0
  91. data/server/node_modules/express/node_modules/qs/support/expresso/Makefile +53 -0
  92. data/server/node_modules/express/node_modules/qs/support/expresso/Readme.md +61 -0
  93. data/server/node_modules/express/node_modules/qs/support/expresso/bin/expresso +856 -0
  94. data/server/node_modules/express/node_modules/qs/support/expresso/docs/api.html +1080 -0
  95. data/server/node_modules/express/node_modules/qs/support/expresso/docs/index.html +377 -0
  96. data/server/node_modules/express/node_modules/qs/support/expresso/docs/index.md +290 -0
  97. data/server/node_modules/express/node_modules/qs/support/expresso/docs/layout/foot.html +3 -0
  98. data/server/node_modules/express/node_modules/qs/support/expresso/docs/layout/head.html +42 -0
  99. data/server/node_modules/express/node_modules/qs/support/expresso/lib/bar.js +4 -0
  100. data/server/node_modules/express/node_modules/qs/support/expresso/lib/foo.js +16 -0
  101. data/server/node_modules/express/node_modules/qs/support/expresso/package.json +12 -0
  102. data/server/node_modules/express/node_modules/qs/support/expresso/test/assert.test.js +91 -0
  103. data/server/node_modules/express/node_modules/qs/support/expresso/test/async.test.js +12 -0
  104. data/server/node_modules/express/node_modules/qs/support/expresso/test/bar.test.js +13 -0
  105. data/server/node_modules/express/node_modules/qs/support/expresso/test/foo.test.js +14 -0
  106. data/server/node_modules/express/node_modules/qs/support/expresso/test/http.test.js +146 -0
  107. data/server/node_modules/express/node_modules/qs/support/expresso/test/serial/async.test.js +39 -0
  108. data/server/node_modules/express/node_modules/qs/support/expresso/test/serial/http.test.js +48 -0
  109. data/server/node_modules/express/node_modules/qs/support/should/History.md +22 -0
  110. data/server/node_modules/express/node_modules/qs/support/should/Makefile +6 -0
  111. data/server/node_modules/express/node_modules/qs/support/should/Readme.md +248 -0
  112. data/server/node_modules/express/node_modules/qs/support/should/examples/runner.js +53 -0
  113. data/server/node_modules/express/node_modules/qs/support/should/index.js +2 -0
  114. data/server/node_modules/express/node_modules/qs/support/should/lib/eql.js +91 -0
  115. data/server/node_modules/express/node_modules/qs/support/should/lib/should.js +548 -0
  116. data/server/node_modules/express/node_modules/qs/support/should/package.json +8 -0
  117. data/server/node_modules/express/node_modules/qs/support/should/test/should.test.js +358 -0
  118. data/server/node_modules/express/node_modules/qs/test/{parse.js → parse.test.js} +2 -1
  119. data/server/node_modules/express/node_modules/qs/test/{stringify.js → stringify.test.js} +0 -0
  120. data/server/node_modules/express/package.json +8 -9
  121. data/server/node_modules/node-uuid/README.md +67 -166
  122. data/server/node_modules/node-uuid/package.json +3 -5
  123. data/server/node_modules/node-uuid/{benchmark → test}/benchmark-native.c +0 -0
  124. data/server/node_modules/node-uuid/test/benchmark.js +27 -0
  125. data/server/node_modules/node-uuid/test/test.html +0 -3
  126. data/server/node_modules/node-uuid/test/test.js +57 -214
  127. data/server/node_modules/node-uuid/uuid.js +56 -225
  128. data/server/node_modules/restler/README.md +7 -20
  129. data/server/node_modules/restler/bin/restler +1 -1
  130. data/server/node_modules/restler/lib/multipartform.js +8 -9
  131. data/server/node_modules/restler/lib/restler.js +22 -64
  132. data/server/node_modules/restler/package.json +2 -2
  133. data/server/node_modules/restler/test/restler.js +2 -22
  134. data/server/node_modules/restler/test/test_helper.js +1 -20
  135. data/server/package.json +10 -10
  136. data/server/web.js +7 -30
  137. metadata +96 -89
  138. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/file/plain.txt +0 -1
  139. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/http/no-filename/generic.http +0 -13
  140. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/js/no-filename.js +0 -3
  141. data/server/node_modules/express/node_modules/connect/node_modules/formidable/Makefile +0 -14
  142. data/server/node_modules/express/node_modules/connect/node_modules/formidable/Readme.md +0 -286
  143. data/server/node_modules/express/node_modules/connect/node_modules/formidable/TODO +0 -3
  144. data/server/node_modules/express/node_modules/connect/node_modules/formidable/benchmark/bench-multipart-parser.js +0 -70
  145. data/server/node_modules/express/node_modules/connect/node_modules/formidable/example/post.js +0 -43
  146. data/server/node_modules/express/node_modules/connect/node_modules/formidable/example/upload.js +0 -48
  147. data/server/node_modules/express/node_modules/connect/node_modules/formidable/index.js +0 -1
  148. data/server/node_modules/express/node_modules/connect/node_modules/formidable/lib/file.js +0 -61
  149. data/server/node_modules/express/node_modules/connect/node_modules/formidable/lib/incoming_form.js +0 -377
  150. data/server/node_modules/express/node_modules/connect/node_modules/formidable/lib/index.js +0 -3
  151. data/server/node_modules/express/node_modules/connect/node_modules/formidable/lib/multipart_parser.js +0 -312
  152. data/server/node_modules/express/node_modules/connect/node_modules/formidable/lib/querystring_parser.js +0 -25
  153. data/server/node_modules/express/node_modules/connect/node_modules/formidable/lib/util.js +0 -6
  154. data/server/node_modules/express/node_modules/connect/node_modules/formidable/package.json +0 -22
  155. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/common.js +0 -19
  156. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/file/funkyfilename.txt +0 -1
  157. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/file/plain.txt +0 -1
  158. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/no-filename/generic.http +0 -13
  159. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/info.md +0 -3
  160. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/osx-chrome-13.http +0 -26
  161. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/osx-firefox-3.6.http +0 -24
  162. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/osx-safari-5.http +0 -23
  163. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-chrome-12.http +0 -24
  164. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-ie-7.http +0 -22
  165. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-ie-8.http +0 -22
  166. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-safari-5.http +0 -22
  167. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/js/no-filename.js +0 -3
  168. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/js/special-chars-in-filename.js +0 -21
  169. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/multi_video.upload +0 -0
  170. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/multipart.js +0 -72
  171. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/integration/test-fixtures.js +0 -89
  172. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/common.js +0 -24
  173. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/integration/test-multipart-parser.js +0 -80
  174. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-file.js +0 -104
  175. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-incoming-form.js +0 -715
  176. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-multipart-parser.js +0 -50
  177. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-querystring-parser.js +0 -45
  178. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/system/test-multi-video-upload.js +0 -72
  179. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/run.js +0 -2
  180. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/unit/test-incoming-form.js +0 -63
  181. data/server/node_modules/express/node_modules/connect/node_modules/formidable/tool/record.js +0 -47
  182. data/server/node_modules/express/node_modules/mkdirp/LICENSE +0 -21
  183. data/server/node_modules/express/node_modules/mkdirp/README.markdown +0 -21
  184. data/server/node_modules/express/node_modules/mkdirp/examples/pow.js +0 -6
  185. data/server/node_modules/express/node_modules/mkdirp/examples/pow.js.orig +0 -6
  186. data/server/node_modules/express/node_modules/mkdirp/examples/pow.js.rej +0 -19
  187. data/server/node_modules/express/node_modules/mkdirp/index.js +0 -20
  188. data/server/node_modules/express/node_modules/mkdirp/package.json +0 -23
  189. data/server/node_modules/express/node_modules/mkdirp/test/mkdirp.js +0 -28
  190. data/server/node_modules/express/node_modules/mkdirp/test/race.js +0 -41
  191. data/server/node_modules/express/node_modules/mkdirp/test/rel.js +0 -32
  192. data/server/node_modules/express/node_modules/qs/test/mocha.opts +0 -2
  193. data/server/node_modules/express/testing/foo/app.js +0 -35
  194. data/server/node_modules/express/testing/foo/package.json +0 -9
  195. data/server/node_modules/express/testing/foo/public/stylesheets/style.css +0 -8
  196. data/server/node_modules/express/testing/foo/routes/index.js +0 -10
  197. data/server/node_modules/express/testing/foo/views/index.jade +0 -2
  198. data/server/node_modules/express/testing/foo/views/layout.jade +0 -6
  199. data/server/node_modules/express/testing/index.js +0 -43
  200. data/server/node_modules/express/testing/public/test.txt +0 -2971
  201. data/server/node_modules/express/testing/views/page.html +0 -1
  202. data/server/node_modules/express/testing/views/page.jade +0 -3
  203. data/server/node_modules/express/testing/views/test.md +0 -1
  204. data/server/node_modules/express/testing/views/user/index.jade +0 -1
  205. data/server/node_modules/express/testing/views/user/list.jade +0 -1
  206. data/server/node_modules/node-uuid/benchmark/README.md +0 -53
  207. data/server/node_modules/node-uuid/benchmark/bench.gnu +0 -174
  208. data/server/node_modules/node-uuid/benchmark/bench.sh +0 -34
  209. data/server/node_modules/node-uuid/benchmark/benchmark.js +0 -84
  210. data/server/node_modules/node-uuid/test/benchmark-native +0 -0
  211. data/server/node_modules/node-uuid/test/compare_v1.js +0 -63
@@ -43,11 +43,7 @@ module.exports = function limit(bytes){
43
43
  req._limit = true;
44
44
 
45
45
  // limit by content-length
46
- if (len && len > bytes) {
47
- res.statusCode = 413;
48
- res.end('Request Entity Too Large');
49
- return;
50
- }
46
+ if (len && len > bytes) deny();
51
47
 
52
48
  // limit
53
49
  req.on('data', function(chunk){
@@ -55,10 +55,10 @@ function defaultFingerprint(req) {
55
55
  };
56
56
 
57
57
  /**
58
- * Paths to ignore.
58
+ * Paths to ignore, defaulting to `/favicon.ico`.
59
59
  */
60
60
 
61
- exports.ignore = [];
61
+ exports.ignore = ['/favicon.ico'];
62
62
 
63
63
  /**
64
64
  * Setup session store with the given `options`.
@@ -39,7 +39,6 @@ var fs = require('fs')
39
39
  *
40
40
  * - `maxAge` Browser cache maxAge in milliseconds. defaults to 0
41
41
  * - `hidden` Allow transfer of hidden files. defaults to false
42
- * - `redirect` Redirect to trailing "/" when the pathname is a dir
43
42
  *
44
43
  * @param {String} root
45
44
  * @param {Object} options
@@ -102,7 +101,6 @@ var send = exports.send = function(req, res, next, options){
102
101
  , head = 'HEAD' == req.method
103
102
  , get = 'GET' == req.method
104
103
  , root = options.root ? normalize(options.root) : null
105
- , redirect = false === options.redirect ? false : true
106
104
  , getOnly = options.getOnly
107
105
  , fn = options.callback
108
106
  , hidden = options.hidden
@@ -134,7 +132,7 @@ var send = exports.send = function(req, res, next, options){
134
132
  : utils.forbidden(res);
135
133
 
136
134
  // index.html support
137
- if (normalize('/') == path[path.length - 1]) path += 'index.html';
135
+ if ('/' == path[path.length - 1]) path += 'index.html';
138
136
 
139
137
  // "hidden" file
140
138
  if (!hidden && '.' == basename(path)[0]) return next();
@@ -151,34 +149,13 @@ var send = exports.send = function(req, res, next, options){
151
149
  : next(err);
152
150
  // redirect directory in case index.html is present
153
151
  } else if (stat.isDirectory()) {
154
- if (!redirect) return next();
155
152
  res.statusCode = 301;
156
153
  res.setHeader('Location', url.pathname + '/');
157
154
  res.end('Redirecting to ' + url.pathname + '/');
158
155
  return;
159
156
  }
160
157
 
161
- // header fields
162
- if (!res.getHeader('Date')) res.setHeader('Date', new Date().toUTCString());
163
- if (!res.getHeader('Cache-Control')) res.setHeader('Cache-Control', 'public, max-age=' + (maxAge / 1000));
164
- if (!res.getHeader('Last-Modified')) res.setHeader('Last-Modified', stat.mtime.toUTCString());
165
- if (!res.getHeader('ETag')) res.setHeader('ETag', utils.etag(stat));
166
- if (!res.getHeader('content-type')) {
167
- var charset = mime.charsets.lookup(type);
168
- res.setHeader('Content-Type', type + (charset ? '; charset=' + charset : ''));
169
- }
170
- res.setHeader('Accept-Ranges', 'bytes');
171
-
172
- // conditional GET support
173
- if (utils.conditionalGET(req)) {
174
- if (!utils.modified(req, res)) {
175
- req.emit('static');
176
- return utils.notModified(res);
177
- }
178
- }
179
-
180
158
  var opts = {};
181
- var chunkSize = stat.size;
182
159
 
183
160
  // we have a Range request
184
161
  if (ranges) {
@@ -189,7 +166,6 @@ var send = exports.send = function(req, res, next, options){
189
166
  // TODO: multiple support
190
167
  opts.start = ranges[0].start;
191
168
  opts.end = ranges[0].end;
192
- chunkSize = opts.end - opts.start + 1;
193
169
  res.statusCode = 206;
194
170
  res.setHeader('Content-Range', 'bytes '
195
171
  + opts.start
@@ -203,9 +179,27 @@ var send = exports.send = function(req, res, next, options){
203
179
  ? fn(new Error('Requested Range Not Satisfiable'))
204
180
  : invalidRange(res);
205
181
  }
182
+ // stream the entire file
183
+ } else {
184
+ res.setHeader('Content-Length', stat.size);
185
+ if (!res.getHeader('Cache-Control')) res.setHeader('Cache-Control', 'public, max-age=' + (maxAge / 1000));
186
+ if (!res.getHeader('Last-Modified')) res.setHeader('Last-Modified', stat.mtime.toUTCString());
187
+ if (!res.getHeader('ETag')) res.setHeader('ETag', utils.etag(stat));
188
+
189
+ // conditional GET support
190
+ if (utils.conditionalGET(req)) {
191
+ if (!utils.modified(req, res)) {
192
+ return utils.notModified(res);
193
+ }
194
+ }
206
195
  }
207
196
 
208
- res.setHeader('Content-Length', chunkSize);
197
+ // header fields
198
+ if (!res.getHeader('content-type')) {
199
+ var charset = mime.charsets.lookup(type);
200
+ res.setHeader('Content-Type', type + (charset ? '; charset=' + charset : ''));
201
+ }
202
+ res.setHeader('Accept-Ranges', 'bytes');
209
203
 
210
204
  // transfer
211
205
  if (head) return res.end();
@@ -219,6 +213,7 @@ var send = exports.send = function(req, res, next, options){
219
213
  if (fn) {
220
214
  function callback(err) { done || fn(err); done = true }
221
215
  req.on('close', callback);
216
+ req.socket.on('error', callback);
222
217
  stream.on('end', callback);
223
218
  }
224
219
  });
@@ -10,7 +10,6 @@
10
10
  */
11
11
 
12
12
  var http = require('http')
13
- , utils = require('../utils')
14
13
  , Cache = require('../cache')
15
14
  , url = require('url')
16
15
  , fs = require('fs');
@@ -34,15 +33,17 @@ var http = require('http')
34
33
  *
35
34
  * Benchmarks:
36
35
  *
37
- * static(): 2700 rps
38
- * node-static: 5300 rps
39
- * static() + staticCache(): 7500 rps
36
+ * static(): 2700 rps
37
+ * node-static: 5300 rps
38
+ * static() + staticCache(): 7500 rps
40
39
  *
41
40
  * Options:
42
41
  *
43
42
  * - `maxObjects` max cache objects [128]
44
43
  * - `maxLength` max cache object length 256kb
45
44
  *
45
+ * TODO: refactore to accept data stores (redis etc)
46
+ *
46
47
  * @param {Type} name
47
48
  * @return {Type}
48
49
  * @api public
@@ -55,82 +56,16 @@ module.exports = function staticCache(options){
55
56
 
56
57
  return function staticCache(req, res, next){
57
58
  var path = url.parse(req.url).pathname
58
- , ranges = req.headers.range
59
59
  , hit = cache.get(path)
60
- , hitCC
61
- , uaCC
62
- , header
63
- , age;
64
-
65
- // cache static
66
- req.on('static', function(stream){
67
- var headers = res._headers
68
- , cc = utils.parseCacheControl(headers['cache-control'] || '')
69
- , contentLength = headers['content-length']
70
- , hit;
71
-
72
- // ignore larger files
73
- if (!contentLength || contentLength > maxlen) return;
74
-
75
- // dont cache items we shouldn't be
76
- if ( cc['no-cache']
77
- || cc['no-store']
78
- || cc['private']
79
- || cc['must-revalidate']) return;
80
-
81
- // if already in cache then validate
82
- if (hit = cache.get(path)){
83
- if (headers.etag == hit[0].etag) {
84
- hit[0].date = new Date;
85
- return;
86
- } else {
87
- cache.remove(path);
88
- }
89
- }
90
-
91
- // validation notifiactions don't contain a steam
92
- if (null == stream) return;
93
-
94
- // add the cache object
95
- var arr = cache.add(path);
96
- arr.push(headers);
97
-
98
- // store the chunks
99
- stream.on('data', function(chunk){
100
- arr.push(chunk);
101
- });
102
-
103
- // flag it as complete
104
- stream.on('end', function(){
105
- arr.complete = true;
106
- });
107
- });
108
-
109
- // cache hit, doesnt support range requests
110
- if (hit && hit.complete && !ranges) {
111
- header = utils.merge({}, hit[0]);
112
- header.Age = age = (new Date - new Date(header.date)) / 1000 | 0;
113
- header.date = new Date().toUTCString();
114
-
115
- // parse cache-controls
116
- hitCC = utils.parseCacheControl(header['cache-control'] || '');
117
- uaCC = utils.parseCacheControl(req.headers['cache-control'] || '');
118
-
119
- // check if we must revalidate(bypass)
120
- if (hitCC['no-cache'] || uaCC['no-cache']) return next();
121
-
122
- // check freshness of entity
123
- if (isStale(hitCC, age) || isStale(uaCC, age)) return next();
124
-
125
- // conditional GET support
126
- if (utils.conditionalGET(req)) {
127
- if (!utils.modified(req, res, header)) {
128
- header['content-length'] = 0;
129
- res.writeHead(304, header);
130
- return res.end();
131
- }
132
- }
133
-
60
+ , cc = req.headers['cache-control']
61
+ , header;
62
+
63
+ // cache hit
64
+ if (hit && hit.complete) {
65
+ // TODO: finish meeee... http caching... throttling etc
66
+ header = hit[0];
67
+ header.Age = (new Date - hit.createdAt) / 1000 | 0;
68
+
134
69
  // HEAD support
135
70
  if ('HEAD' == req.method) {
136
71
  header['content-length'] = 0;
@@ -157,19 +92,31 @@ module.exports = function staticCache(options){
157
92
  return write(1);
158
93
  }
159
94
 
95
+ // cache static
96
+ req.on('static', function(stream){
97
+ // ignore larger files
98
+ var contentLength = res._headers['content-length'];
99
+ if (!contentLength || contentLength > maxlen) return;
100
+
101
+ // exists
102
+ if (cache.get(path)) return;
103
+
104
+ // add the cache object
105
+ var arr = cache.add(path);
106
+ arr.push(res._headers);
107
+
108
+ // store the chunks
109
+ stream.on('data', function(chunk){
110
+ arr.push(chunk);
111
+ });
112
+
113
+ // flag it as complete
114
+ stream.on('end', function(){
115
+ arr.complete = true;
116
+ });
117
+ });
118
+
160
119
  next();
161
120
  }
162
121
  };
163
122
 
164
- /**
165
- * Check if cache item is stale
166
- *
167
- * @param {Object} cc
168
- * @param {Number} age
169
- * @return {Boolean}
170
- * @api private
171
- */
172
-
173
- function isStale(cc, age) {
174
- return cc['max-age'] && cc['max-age'] <= age;
175
- }
@@ -36,7 +36,7 @@ module.exports = function vhost(hostname, server){
36
36
  var host = req.headers.host.split(':')[0];
37
37
  if (req.subdomains = regexp.exec(host)) {
38
38
  req.subdomains = req.subdomains[0].split('.').slice(0, -1);
39
- server.emit("request", req, res);
39
+ server.emit("request", req, res, next);
40
40
  } else {
41
41
  next();
42
42
  }
@@ -403,21 +403,14 @@ exports.parseRange = function(size, str){
403
403
  */
404
404
 
405
405
  exports.parseCacheControl = function(str){
406
- var directives = str.split(',')
406
+ var parts = str.split('=')
407
+ , key = parts.shift()
408
+ , val = parseInt(parts.shift(), 10)
407
409
  , obj = {};
408
-
409
- for(var i = 0, len = directives.length; i < len; i++) {
410
- var parts = directives[i].split('=')
411
- , key = parts.shift().trim()
412
- , val = parseInt(parts.shift(), 10);
413
-
414
- obj[key] = isNaN(val) ? true : val;
415
- }
416
-
410
+ obj[key] = isNaN(val) ? true : val;
417
411
  return obj;
418
412
  };
419
413
 
420
-
421
414
  /**
422
415
  * Convert array-like object to an `Array`.
423
416
  *
@@ -1,25 +1,24 @@
1
1
  {
2
2
  "name": "connect",
3
- "version": "1.8.5",
3
+ "version": "1.7.1",
4
4
  "description": "High performance middleware framework",
5
5
  "keywords": ["framework", "web", "middleware", "connect", "rack"],
6
6
  "repository": "git://github.com/senchalabs/connect.git",
7
7
  "author": "TJ Holowaychuk <tj@vision-media.ca> (http://tjholowaychuk.com)",
8
8
  "repository": "git://github.com/senchalabs/connect",
9
9
  "dependencies": {
10
- "qs": ">= 0.4.0",
11
- "mime": ">= 0.0.1",
12
- "formidable": "1.0.x"
10
+ "qs": ">= 0.3.1",
11
+ "mime": ">= 0.0.1"
13
12
  },
14
13
  "devDependencies": {
15
- "expresso": "0.9.2",
14
+ "expresso": "0.7.6",
16
15
  "koala": "0.1.2",
17
16
  "less": "1.1.1",
18
17
  "sass": "0.5.0",
19
18
  "markdown": "0.2.1",
20
19
  "ejs": "0.4.3",
21
- "should": "0.3.2"
20
+ "should": "0.2.1"
22
21
  },
23
22
  "main": "index",
24
- "engines": { "node": ">= 0.4.1 < 0.7.0" }
23
+ "engines": { "node": ">= 0.4.1 < 0.5.0" }
25
24
  }
@@ -1,52 +1,39 @@
1
1
 
2
+ /**
3
+ * Module dependencies.
4
+ */
5
+
2
6
  var connect = require('./')
7
+ , utils = connect.utils
3
8
  , http = require('http')
4
- , RedisStore = require('connect-redis')(connect);
9
+ , fs = require('fs');
5
10
 
6
- var app = connect();
7
- app.use(connect.cookieParser('fucj'));
8
- app.use(connect.session({store:new RedisStore}));
9
- app.use(function(req, res, next){
10
- req.session.views = (req.session.views || 0) + 1;
11
- res.writeHead(200, {"Content-Type": "text/plain"});
12
- res.end("You've viewed this page "+req.session.views+" times.");
13
- })
14
11
 
15
- http.createServer(app).listen(3000);
12
+ connect()
13
+ .use(connect.cookieParser())
14
+ .use(connect.session({ secret: 'hey' }))
15
+ .use(function(req, res, next){
16
+ if ('/foo' == req.url) {
17
+ req.session.foo = 'bar';
18
+ }
19
+ res.end('hello\n')
20
+ })
21
+ .listen(3000)
16
22
 
23
+ // Connect: 2296
24
+ // Connect+LRU: 4900
25
+ // node-static: 3865
17
26
 
18
- // var set = RedisStore.prototype.set;
19
- //
20
- // function slow(sid){
21
- // console.log('%s saving', sid);
22
- // var args = arguments;
23
- // setTimeout(function(self){
24
- // console.log('%s saved', sid);
25
- // set.apply(self, args);
26
- // }, 2000, this);
27
- // };
28
- //
29
- // http.createServer(connect()
30
- // .use(connect.logger('dev'))
31
- // .use(connect.cookieParser('keyboard cat'))
32
- // .use(connect.session({ store: new RedisStore }))
33
- // .use(function(req, res, next){
34
- // var sess = req.session;
35
- // switch (req.url) {
36
- // case '/foo.js':
37
- // console.log('%s foo.js sid', sess.id);
38
- // RedisStore.prototype.set = set;
39
- // res.end('data');
40
- // break;
41
- // default:
42
- // console.log('%s html sid', sess.id);
43
- // RedisStore.prototype.set = slow;
44
- // res.setHeader('Content-Type', 'html');
45
- // res.write('<html><head><script src="/foo.js"></script></head><body>');
46
- // setTimeout(function(){
47
- // res.end('</body></html>');
48
- // }, 1000);
49
- // }
50
- // })).listen(3000);
27
+ // ab -n 5000 -c 50 -k http://local/Readme.md
28
+
29
+ // 472k
30
+ // node-static: 1651rps
31
+ // connect: 581rps
32
+
33
+ // var static = require('node-static')
34
+ // , file = new static.Server(__dirname);
51
35
  //
52
- // console.log('port 3000');
36
+ // var send = connect.static(__dirname);
37
+ // http.createServer(function(req, res){
38
+ // file.serve(req, res);
39
+ // }).listen(3000);