vulcan 0.6.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. data/lib/vulcan/cli.rb +20 -10
  2. data/lib/vulcan/version.rb +1 -1
  3. data/server/Procfile +1 -1
  4. data/server/bin/web +10 -0
  5. data/server/lib/cloudant.coffee +20 -0
  6. data/server/lib/logger.coffee +17 -0
  7. data/server/lib/on.coffee +10 -0
  8. data/server/lib/spawner.coffee +65 -0
  9. data/server/node_modules/coffee-script/CNAME +1 -0
  10. data/server/node_modules/coffee-script/LICENSE +22 -0
  11. data/server/node_modules/coffee-script/README +51 -0
  12. data/server/node_modules/coffee-script/Rakefile +78 -0
  13. data/server/node_modules/coffee-script/bin/cake +7 -0
  14. data/server/node_modules/coffee-script/bin/coffee +7 -0
  15. data/server/node_modules/coffee-script/extras/jsl.conf +44 -0
  16. data/server/node_modules/coffee-script/lib/coffee-script/browser.js +92 -0
  17. data/server/node_modules/coffee-script/lib/coffee-script/cake.js +111 -0
  18. data/server/node_modules/coffee-script/lib/coffee-script/coffee-script.js +167 -0
  19. data/server/node_modules/coffee-script/lib/coffee-script/command.js +500 -0
  20. data/server/node_modules/coffee-script/lib/coffee-script/grammar.js +606 -0
  21. data/server/node_modules/coffee-script/lib/coffee-script/helpers.js +77 -0
  22. data/server/node_modules/coffee-script/lib/coffee-script/index.js +11 -0
  23. data/server/node_modules/coffee-script/lib/coffee-script/lexer.js +788 -0
  24. data/server/node_modules/coffee-script/lib/coffee-script/nodes.js +2986 -0
  25. data/server/node_modules/coffee-script/lib/coffee-script/optparse.js +138 -0
  26. data/server/node_modules/coffee-script/lib/coffee-script/parser.js +683 -0
  27. data/server/node_modules/coffee-script/lib/coffee-script/repl.js +261 -0
  28. data/server/node_modules/coffee-script/lib/coffee-script/rewriter.js +349 -0
  29. data/server/node_modules/coffee-script/lib/coffee-script/scope.js +146 -0
  30. data/server/node_modules/coffee-script/package.json +55 -0
  31. data/server/node_modules/connect-form/History.md +0 -6
  32. data/server/node_modules/connect-form/lib/connect-form.js +2 -4
  33. data/server/node_modules/connect-form/node_modules/formidable/Readme.md +64 -36
  34. data/server/node_modules/connect-form/node_modules/formidable/lib/incoming_form.js +5 -1
  35. data/server/node_modules/connect-form/node_modules/formidable/package.json +20 -6
  36. data/server/node_modules/connect-form/node_modules/formidable/test/common.js +5 -6
  37. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/file/funkyfilename.txt +1 -0
  38. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/js/special-chars-in-filename.js +1 -1
  39. data/server/node_modules/connect-form/node_modules/formidable/test/{slow → integration}/test-fixtures.js +38 -33
  40. data/server/node_modules/connect-form/node_modules/formidable/test/legacy/simple/test-incoming-form.js +11 -0
  41. data/server/node_modules/connect-form/node_modules/formidable/test/run.js +1 -6
  42. data/server/node_modules/connect-form/node_modules/formidable/test/unit/test-incoming-form.js +63 -0
  43. data/server/node_modules/connect-form/package.json +27 -5
  44. data/server/node_modules/cradle/README.md +10 -10
  45. data/server/node_modules/cradle/lib/cradle.js +117 -523
  46. data/server/node_modules/cradle/lib/cradle/database/attachments.js +120 -0
  47. data/server/node_modules/cradle/lib/cradle/database/changes.js +56 -0
  48. data/server/node_modules/cradle/lib/cradle/database/documents.js +215 -0
  49. data/server/node_modules/cradle/lib/cradle/database/index.js +65 -0
  50. data/server/node_modules/cradle/lib/cradle/database/views.js +125 -0
  51. data/server/node_modules/cradle/node_modules/follow/LICENSE +202 -0
  52. data/server/node_modules/cradle/node_modules/follow/README.md +164 -0
  53. data/server/node_modules/cradle/node_modules/follow/Rakefile +54 -0
  54. data/server/node_modules/cradle/node_modules/follow/api.js +35 -0
  55. data/server/node_modules/cradle/node_modules/follow/browser/eventemitter2.js +453 -0
  56. data/server/node_modules/cradle/node_modules/follow/browser/export.js +78 -0
  57. data/server/node_modules/cradle/node_modules/follow/browser/index.html +14 -0
  58. data/server/node_modules/cradle/node_modules/follow/browser/jquery-1.6.1.min.js +18 -0
  59. data/server/node_modules/cradle/node_modules/follow/browser/log4js.js +46 -0
  60. data/server/node_modules/cradle/node_modules/follow/browser/main.js +92 -0
  61. data/server/node_modules/cradle/node_modules/follow/browser/querystring.js +28 -0
  62. data/server/node_modules/cradle/node_modules/follow/browser/request.jquery.js +237 -0
  63. data/server/node_modules/cradle/node_modules/follow/browser/require.js +33 -0
  64. data/server/node_modules/cradle/node_modules/follow/browser/util.js +28 -0
  65. data/server/node_modules/cradle/node_modules/follow/cli.js +101 -0
  66. data/server/node_modules/cradle/node_modules/follow/lib/feed.js +556 -0
  67. data/server/node_modules/cradle/node_modules/follow/lib/index.js +66 -0
  68. data/server/node_modules/cradle/node_modules/follow/lib/stream.js +305 -0
  69. data/server/node_modules/cradle/node_modules/follow/node_modules/request/LICENSE +55 -0
  70. data/server/node_modules/cradle/node_modules/follow/node_modules/request/README.md +285 -0
  71. data/server/node_modules/cradle/node_modules/follow/node_modules/request/main.js +618 -0
  72. data/server/node_modules/cradle/node_modules/follow/node_modules/request/mimetypes.js +146 -0
  73. data/server/node_modules/cradle/node_modules/follow/node_modules/request/oauth.js +34 -0
  74. data/server/node_modules/cradle/node_modules/follow/node_modules/request/package.json +42 -0
  75. data/server/node_modules/cradle/node_modules/follow/node_modules/request/tests/googledoodle.png +0 -0
  76. data/server/node_modules/cradle/node_modules/follow/node_modules/request/tests/run.sh +6 -0
  77. data/server/node_modules/cradle/node_modules/follow/node_modules/request/tests/server.js +57 -0
  78. data/server/node_modules/cradle/node_modules/follow/node_modules/request/tests/test-body.js +90 -0
  79. data/server/node_modules/cradle/node_modules/follow/node_modules/request/tests/test-cookie.js +29 -0
  80. data/server/node_modules/cradle/node_modules/follow/node_modules/request/tests/test-cookiejar.js +90 -0
  81. data/server/node_modules/cradle/node_modules/follow/node_modules/request/tests/test-errors.js +30 -0
  82. data/server/node_modules/cradle/node_modules/follow/node_modules/request/tests/test-oauth.js +109 -0
  83. data/server/node_modules/cradle/node_modules/follow/node_modules/request/tests/test-pipes.js +167 -0
  84. data/server/node_modules/cradle/node_modules/follow/node_modules/request/tests/test-proxy.js +39 -0
  85. data/server/node_modules/cradle/node_modules/follow/node_modules/request/tests/test-timeout.js +87 -0
  86. data/server/node_modules/cradle/node_modules/follow/node_modules/request/uuid.js +19 -0
  87. data/server/node_modules/cradle/node_modules/follow/node_modules/request/vendor/cookie/index.js +55 -0
  88. data/server/node_modules/cradle/node_modules/follow/node_modules/request/vendor/cookie/jar.js +72 -0
  89. data/server/node_modules/cradle/node_modules/follow/package.json +45 -0
  90. data/server/node_modules/cradle/node_modules/follow/test/couch.js +153 -0
  91. data/server/node_modules/cradle/node_modules/follow/test/follow.js +136 -0
  92. data/server/node_modules/cradle/node_modules/follow/test/issues.js +178 -0
  93. data/server/node_modules/cradle/node_modules/follow/test/issues/10.js +24 -0
  94. data/server/node_modules/cradle/node_modules/follow/test/stream.js +493 -0
  95. data/server/node_modules/cradle/node_modules/request/LICENSE +55 -0
  96. data/server/node_modules/cradle/node_modules/request/README.md +287 -0
  97. data/server/node_modules/cradle/node_modules/request/forever.js +103 -0
  98. data/server/node_modules/cradle/node_modules/request/main.js +913 -0
  99. data/server/node_modules/cradle/node_modules/request/mimetypes.js +152 -0
  100. data/server/node_modules/cradle/node_modules/request/oauth.js +34 -0
  101. data/server/node_modules/cradle/node_modules/request/package.json +42 -0
  102. data/server/node_modules/cradle/node_modules/request/tests/googledoodle.png +0 -0
  103. data/server/node_modules/cradle/node_modules/request/tests/run.js +38 -0
  104. data/server/node_modules/cradle/node_modules/request/tests/server.js +82 -0
  105. data/server/node_modules/cradle/node_modules/request/tests/squid.conf +77 -0
  106. data/server/node_modules/cradle/node_modules/request/tests/ssl/ca/ca.cnf +20 -0
  107. data/server/node_modules/cradle/node_modules/request/tests/ssl/ca/ca.crl +0 -0
  108. data/server/node_modules/cradle/node_modules/request/tests/ssl/ca/ca.crt +17 -0
  109. data/server/node_modules/cradle/node_modules/request/tests/ssl/ca/ca.csr +13 -0
  110. data/server/node_modules/cradle/node_modules/request/tests/ssl/ca/ca.key +18 -0
  111. data/server/node_modules/cradle/node_modules/request/tests/ssl/ca/ca.srl +1 -0
  112. data/server/node_modules/cradle/node_modules/request/tests/ssl/ca/server.cnf +19 -0
  113. data/server/node_modules/cradle/node_modules/request/tests/ssl/ca/server.crt +16 -0
  114. data/server/node_modules/cradle/node_modules/request/tests/ssl/ca/server.csr +11 -0
  115. data/server/node_modules/cradle/node_modules/request/tests/ssl/ca/server.js +28 -0
  116. data/server/node_modules/cradle/node_modules/request/tests/ssl/ca/server.key +9 -0
  117. data/server/node_modules/cradle/node_modules/request/tests/ssl/npm-ca.crt +16 -0
  118. data/server/node_modules/cradle/node_modules/request/tests/ssl/test.crt +15 -0
  119. data/server/node_modules/cradle/node_modules/request/tests/ssl/test.key +15 -0
  120. data/server/node_modules/cradle/node_modules/request/tests/test-body.js +95 -0
  121. data/server/node_modules/cradle/node_modules/request/tests/test-cookie.js +29 -0
  122. data/server/node_modules/cradle/node_modules/request/tests/test-cookiejar.js +90 -0
  123. data/server/node_modules/cradle/node_modules/request/tests/test-defaults.js +68 -0
  124. data/server/node_modules/cradle/node_modules/request/tests/test-errors.js +37 -0
  125. data/server/node_modules/cradle/node_modules/request/tests/test-headers.js +52 -0
  126. data/server/node_modules/cradle/node_modules/request/tests/test-httpModule.js +94 -0
  127. data/server/node_modules/cradle/node_modules/request/tests/test-https-strict.js +97 -0
  128. data/server/node_modules/cradle/node_modules/request/tests/test-https.js +86 -0
  129. data/server/node_modules/cradle/node_modules/request/tests/test-oauth.js +117 -0
  130. data/server/node_modules/cradle/node_modules/request/tests/test-params.js +92 -0
  131. data/server/node_modules/cradle/node_modules/request/tests/test-pipes.js +202 -0
  132. data/server/node_modules/cradle/node_modules/request/tests/test-proxy.js +39 -0
  133. data/server/node_modules/cradle/node_modules/request/tests/test-qs.js +28 -0
  134. data/server/node_modules/cradle/node_modules/request/tests/test-redirect.js +154 -0
  135. data/server/node_modules/cradle/node_modules/request/tests/test-timeout.js +87 -0
  136. data/server/node_modules/cradle/node_modules/request/tests/test-toJSON.js +14 -0
  137. data/server/node_modules/cradle/node_modules/request/tests/test-tunnel.js +61 -0
  138. data/server/node_modules/cradle/node_modules/request/tunnel.js +229 -0
  139. data/server/node_modules/cradle/node_modules/request/uuid.js +19 -0
  140. data/server/node_modules/cradle/node_modules/request/vendor/cookie/index.js +65 -0
  141. data/server/node_modules/cradle/node_modules/request/vendor/cookie/jar.js +72 -0
  142. data/server/node_modules/cradle/node_modules/vargs/package.json +33 -10
  143. data/server/node_modules/cradle/package.json +50 -12
  144. data/server/node_modules/cradle/test/cache-test.js +1 -4
  145. data/server/node_modules/cradle/test/connection-test.js +179 -0
  146. data/server/node_modules/cradle/test/database-attachment-test.js +344 -0
  147. data/server/node_modules/cradle/test/database-cache-test.js +132 -0
  148. data/server/node_modules/cradle/test/database-test.js +219 -0
  149. data/server/node_modules/cradle/test/database-view-test.js +141 -0
  150. data/server/node_modules/cradle/test/fixtures/databases.json +28 -1
  151. data/server/node_modules/cradle/test/helpers/seed.js +14 -5
  152. data/server/node_modules/cradle/test/response-test.js +1 -1
  153. data/server/node_modules/express/History.md +16 -0
  154. data/server/node_modules/express/bin/express +7 -6
  155. data/server/node_modules/express/lib-cov/application.js +510 -0
  156. data/server/node_modules/express/lib-cov/express.js +65 -0
  157. data/server/node_modules/express/lib-cov/middleware.js +54 -0
  158. data/server/node_modules/express/lib-cov/request.js +225 -0
  159. data/server/node_modules/express/lib-cov/response.js +611 -0
  160. data/server/node_modules/express/lib-cov/router/collection.js +40 -0
  161. data/server/node_modules/express/lib-cov/router/index.js +515 -0
  162. data/server/node_modules/express/lib-cov/router/methods.js +9 -0
  163. data/server/node_modules/express/lib-cov/router/route.js +68 -0
  164. data/server/node_modules/express/lib-cov/utils.js +151 -0
  165. data/server/node_modules/express/lib-cov/view.js +81 -0
  166. data/server/node_modules/express/lib/express.js +1 -1
  167. data/server/node_modules/express/lib/http.js +1 -2
  168. data/server/node_modules/express/lib/request.js +2 -2
  169. data/server/node_modules/express/lib/router/methods.js +10 -1
  170. data/server/node_modules/express/node_modules/connect/lib/connect.js +1 -1
  171. data/server/node_modules/express/node_modules/connect/lib/http.js +3 -2
  172. data/server/node_modules/express/node_modules/connect/lib/middleware/limit.js +0 -2
  173. data/server/node_modules/express/node_modules/connect/lib/middleware/session.js +1 -2
  174. data/server/node_modules/express/node_modules/connect/node_modules/formidable/Readme.md +42 -25
  175. data/server/node_modules/express/node_modules/connect/node_modules/formidable/lib/incoming_form.js +1 -0
  176. data/server/node_modules/express/node_modules/connect/node_modules/formidable/package.json +14 -3
  177. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-incoming-form.js +11 -0
  178. data/server/node_modules/express/node_modules/connect/package.json +35 -7
  179. data/server/node_modules/express/node_modules/mime/package.json +30 -8
  180. data/server/node_modules/express/node_modules/mkdirp/README.markdown +35 -2
  181. data/server/node_modules/express/node_modules/mkdirp/examples/pow.js +1 -1
  182. data/server/node_modules/express/node_modules/mkdirp/index.js +72 -13
  183. data/server/node_modules/express/node_modules/mkdirp/package.json +39 -21
  184. data/server/node_modules/express/node_modules/mkdirp/test/chmod.js +38 -0
  185. data/server/node_modules/express/node_modules/mkdirp/test/clobber.js +37 -0
  186. data/server/node_modules/express/node_modules/mkdirp/test/perm.js +32 -0
  187. data/server/node_modules/express/node_modules/mkdirp/test/perm_sync.js +39 -0
  188. data/server/node_modules/express/node_modules/mkdirp/test/sync.js +27 -0
  189. data/server/node_modules/express/node_modules/mkdirp/test/umask.js +28 -0
  190. data/server/node_modules/express/node_modules/mkdirp/test/umask_sync.js +27 -0
  191. data/server/node_modules/express/node_modules/qs/History.md +10 -0
  192. data/server/node_modules/express/node_modules/qs/Readme.md +9 -2
  193. data/server/node_modules/express/node_modules/qs/examples.js +3 -0
  194. data/server/node_modules/express/node_modules/qs/lib/querystring.js +8 -6
  195. data/server/node_modules/express/node_modules/qs/package.json +26 -8
  196. data/server/node_modules/express/node_modules/qs/test/parse.js +13 -1
  197. data/server/node_modules/express/node_modules/qs/test/stringify.js +45 -37
  198. data/server/node_modules/express/package.json +55 -16
  199. data/server/node_modules/express/test.js +41 -0
  200. data/server/node_modules/knox/package.json +26 -4
  201. data/server/node_modules/node-uuid/package.json +40 -11
  202. data/server/node_modules/node-uuid/test/test.js +1 -1
  203. data/server/node_modules/nodemon/README.md +120 -0
  204. data/server/node_modules/nodemon/nodemon.js +518 -0
  205. data/server/node_modules/nodemon/nodemonignore.example +11 -0
  206. data/server/node_modules/nodemon/package.json +49 -0
  207. data/server/node_modules/restler/README.md +144 -94
  208. data/server/node_modules/restler/lib/multipartform.js +2 -0
  209. data/server/node_modules/restler/lib/restler.js +218 -61
  210. data/server/node_modules/restler/package.json +35 -8
  211. data/server/node_modules/restler/test/all.js +6 -1
  212. data/server/node_modules/restler/test/restler.js +624 -118
  213. data/server/package.json +14 -10
  214. data/server/web.coffee +64 -0
  215. data/server/web.js +15 -3
  216. metadata +170 -57
  217. data/server/index.js +0 -14
  218. data/server/node_modules/connect-form/LICENSE +0 -22
  219. data/server/node_modules/connect-form/index.js +0 -100
  220. data/server/node_modules/connect-form/node_modules/formidable/test/fast/test-incoming-form.js +0 -45
  221. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/http/no-filename/generic.http +0 -13
  222. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/http/special-chars-in-filename/osx-chrome-13.http +0 -26
  223. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/http/special-chars-in-filename/osx-firefox-3.6.http +0 -24
  224. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/http/special-chars-in-filename/osx-safari-5.http +0 -23
  225. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-chrome-12.http +0 -24
  226. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-ie-7.http +0 -22
  227. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-ie-8.http +0 -22
  228. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-safari-5.http +0 -22
  229. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/multi_video.upload +0 -0
  230. data/server/node_modules/cradle/Makefile +0 -10
  231. data/server/node_modules/cradle/test/cradle-test.js +0 -650
  232. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/no-filename/generic.http +0 -13
  233. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/osx-chrome-13.http +0 -26
  234. 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
  235. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/osx-safari-5.http +0 -23
  236. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-chrome-12.http +0 -24
  237. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-ie-7.http +0 -22
  238. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-ie-8.http +0 -22
  239. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-safari-5.http +0 -22
  240. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/multi_video.upload +0 -0
  241. data/server/node_modules/express/node_modules/connect/test.js +0 -52
  242. data/server/node_modules/express/testing/foo/app.js +0 -35
  243. data/server/node_modules/express/testing/foo/package.json +0 -9
  244. data/server/node_modules/express/testing/foo/public/stylesheets/style.css +0 -8
  245. data/server/node_modules/express/testing/foo/routes/index.js +0 -10
  246. data/server/node_modules/express/testing/foo/views/index.jade +0 -2
  247. data/server/node_modules/express/testing/foo/views/layout.jade +0 -6
  248. data/server/node_modules/express/testing/index.js +0 -43
  249. data/server/node_modules/express/testing/public/test.txt +0 -2971
  250. data/server/node_modules/express/testing/views/page.html +0 -1
  251. data/server/node_modules/express/testing/views/page.jade +0 -3
  252. data/server/node_modules/express/testing/views/test.md +0 -1
  253. data/server/node_modules/express/testing/views/user/index.jade +0 -1
  254. data/server/node_modules/express/testing/views/user/list.jade +0 -1
  255. data/server/node_modules/knox/lib/knox/mime/index.js +0 -308
  256. data/server/node_modules/knox/lib/knox/mime/test.js +0 -59
  257. data/server/node_modules/node-uuid/test/benchmark-native +0 -0
  258. data/server/node_modules/on/index.js +0 -13
  259. data/server/node_modules/restler/test/test_helper.js +0 -163
  260. data/server/node_modules/spawner/index.js +0 -106
@@ -0,0 +1,87 @@
1
+ var server = require('./server')
2
+ , events = require('events')
3
+ , stream = require('stream')
4
+ , assert = require('assert')
5
+ , request = require('../main.js')
6
+ ;
7
+
8
+ var s = server.createServer();
9
+ var expectedBody = "waited";
10
+ var remainingTests = 5;
11
+
12
+ s.listen(s.port, function () {
13
+ // Request that waits for 200ms
14
+ s.on('/timeout', function (req, resp) {
15
+ setTimeout(function(){
16
+ resp.writeHead(200, {'content-type':'text/plain'})
17
+ resp.write(expectedBody)
18
+ resp.end()
19
+ }, 200);
20
+ });
21
+
22
+ // Scenario that should timeout
23
+ var shouldTimeout = {
24
+ url: s.url + "/timeout",
25
+ timeout:100
26
+ }
27
+
28
+
29
+ request(shouldTimeout, function (err, resp, body) {
30
+ assert.equal(err.code, "ETIMEDOUT");
31
+ checkDone();
32
+ })
33
+
34
+
35
+ // Scenario that shouldn't timeout
36
+ var shouldntTimeout = {
37
+ url: s.url + "/timeout",
38
+ timeout:300
39
+ }
40
+
41
+ request(shouldntTimeout, function (err, resp, body) {
42
+ assert.equal(err, null);
43
+ assert.equal(expectedBody, body)
44
+ checkDone();
45
+ })
46
+
47
+ // Scenario with no timeout set, so shouldn't timeout
48
+ var noTimeout = {
49
+ url: s.url + "/timeout"
50
+ }
51
+
52
+ request(noTimeout, function (err, resp, body) {
53
+ assert.equal(err);
54
+ assert.equal(expectedBody, body)
55
+ checkDone();
56
+ })
57
+
58
+ // Scenario with a negative timeout value, should be treated a zero or the minimum delay
59
+ var negativeTimeout = {
60
+ url: s.url + "/timeout",
61
+ timeout:-1000
62
+ }
63
+
64
+ request(negativeTimeout, function (err, resp, body) {
65
+ assert.equal(err.code, "ETIMEDOUT");
66
+ checkDone();
67
+ })
68
+
69
+ // Scenario with a float timeout value, should be rounded by setTimeout anyway
70
+ var floatTimeout = {
71
+ url: s.url + "/timeout",
72
+ timeout: 100.76
73
+ }
74
+
75
+ request(floatTimeout, function (err, resp, body) {
76
+ assert.equal(err.code, "ETIMEDOUT");
77
+ checkDone();
78
+ })
79
+
80
+ function checkDone() {
81
+ if(--remainingTests == 0) {
82
+ s.close();
83
+ console.log("All tests passed.");
84
+ }
85
+ }
86
+ })
87
+
@@ -0,0 +1,14 @@
1
+ var request = require('../main')
2
+ , http = require('http')
3
+ , assert = require('assert')
4
+ ;
5
+
6
+ var s = http.createServer(function (req, resp) {
7
+ resp.statusCode = 200
8
+ resp.end('asdf')
9
+ }).listen(8080, function () {
10
+ var r = request('http://localhost:8080', function (e, resp) {
11
+ assert(JSON.parse(JSON.stringify(r)).response.statusCode, 200)
12
+ s.close()
13
+ })
14
+ })
@@ -0,0 +1,61 @@
1
+ // test that we can tunnel a https request over an http proxy
2
+ // keeping all the CA and whatnot intact.
3
+ //
4
+ // Note: this requires that squid is installed.
5
+ // If the proxy fails to start, we'll just log a warning and assume success.
6
+
7
+ var server = require('./server')
8
+ , assert = require('assert')
9
+ , request = require('../main.js')
10
+ , fs = require('fs')
11
+ , path = require('path')
12
+ , caFile = path.resolve(__dirname, 'ssl/npm-ca.crt')
13
+ , ca = fs.readFileSync(caFile)
14
+ , child_process = require('child_process')
15
+ , sqConf = path.resolve(__dirname, 'squid.conf')
16
+ , sqArgs = ['-f', sqConf, '-N', '-d', '5']
17
+ , proxy = 'http://localhost:3128'
18
+ , hadError = null
19
+
20
+ var squid = child_process.spawn('squid', sqArgs);
21
+ var ready = false
22
+
23
+ squid.stderr.on('data', function (c) {
24
+ console.error('SQUIDERR ' + c.toString().trim().split('\n')
25
+ .join('\nSQUIDERR '))
26
+ ready = c.toString().match(/ready to serve requests/i)
27
+ })
28
+
29
+ squid.stdout.on('data', function (c) {
30
+ console.error('SQUIDOUT ' + c.toString().trim().split('\n')
31
+ .join('\nSQUIDOUT '))
32
+ })
33
+
34
+ squid.on('exit', function (c) {
35
+ console.error('exit '+c)
36
+ if (c && !ready) {
37
+ console.error('squid must be installed to run this test.')
38
+ c = null
39
+ hadError = null
40
+ process.exit(0)
41
+ return
42
+ }
43
+
44
+ if (c) {
45
+ hadError = hadError || new Error('Squid exited with '+c)
46
+ }
47
+ if (hadError) throw hadError
48
+ })
49
+
50
+ setTimeout(function F () {
51
+ if (!ready) return setTimeout(F, 100)
52
+ request({ uri: 'https://registry.npmjs.org/request/'
53
+ , proxy: 'http://localhost:3128'
54
+ , ca: ca
55
+ , json: true }, function (er, body) {
56
+ hadError = er
57
+ console.log(er || typeof body)
58
+ if (!er) console.log("ok")
59
+ squid.kill('SIGKILL')
60
+ })
61
+ }, 100)
@@ -0,0 +1,229 @@
1
+ 'use strict';
2
+
3
+ var net = require('net');
4
+ var tls = require('tls');
5
+ var http = require('http');
6
+ var https = require('https');
7
+ var events = require('events');
8
+ var assert = require('assert');
9
+ var util = require('util');
10
+
11
+
12
+ exports.httpOverHttp = httpOverHttp;
13
+ exports.httpsOverHttp = httpsOverHttp;
14
+ exports.httpOverHttps = httpOverHttps;
15
+ exports.httpsOverHttps = httpsOverHttps;
16
+
17
+
18
+ function httpOverHttp(options) {
19
+ var agent = new TunnelingAgent(options);
20
+ agent.request = http.request;
21
+ return agent;
22
+ }
23
+
24
+ function httpsOverHttp(options) {
25
+ var agent = new TunnelingAgent(options);
26
+ agent.request = http.request;
27
+ agent.createSocket = createSecureSocket;
28
+ return agent;
29
+ }
30
+
31
+ function httpOverHttps(options) {
32
+ var agent = new TunnelingAgent(options);
33
+ agent.request = https.request;
34
+ return agent;
35
+ }
36
+
37
+ function httpsOverHttps(options) {
38
+ var agent = new TunnelingAgent(options);
39
+ agent.request = https.request;
40
+ agent.createSocket = createSecureSocket;
41
+ return agent;
42
+ }
43
+
44
+
45
+ function TunnelingAgent(options) {
46
+ var self = this;
47
+ self.options = options || {};
48
+ self.proxyOptions = self.options.proxy || {};
49
+ self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets;
50
+ self.requests = [];
51
+ self.sockets = [];
52
+
53
+ self.on('free', function onFree(socket, host, port) {
54
+ for (var i = 0, len = self.requests.length; i < len; ++i) {
55
+ var pending = self.requests[i];
56
+ if (pending.host === host && pending.port === port) {
57
+ // Detect the request to connect same origin server,
58
+ // reuse the connection.
59
+ self.requests.splice(i, 1);
60
+ pending.request.onSocket(socket);
61
+ return;
62
+ }
63
+ }
64
+ socket.destroy();
65
+ self.removeSocket(socket);
66
+ });
67
+ }
68
+ util.inherits(TunnelingAgent, events.EventEmitter);
69
+
70
+ TunnelingAgent.prototype.addRequest = function addRequest(req, host, port) {
71
+ var self = this;
72
+
73
+ if (self.sockets.length >= this.maxSockets) {
74
+ // We are over limit so we'll add it to the queue.
75
+ self.requests.push({host: host, port: port, request: req});
76
+ return;
77
+ }
78
+
79
+ // If we are under maxSockets create a new one.
80
+ self.createSocket({host: host, port: port, request: req}, function(socket) {
81
+ socket.on('free', onFree);
82
+ socket.on('close', onCloseOrRemove);
83
+ socket.on('agentRemove', onCloseOrRemove);
84
+ req.onSocket(socket);
85
+
86
+ function onFree() {
87
+ self.emit('free', socket, host, port);
88
+ }
89
+
90
+ function onCloseOrRemove(err) {
91
+ self.removeSocket();
92
+ socket.removeListener('free', onFree);
93
+ socket.removeListener('close', onCloseOrRemove);
94
+ socket.removeListener('agentRemove', onCloseOrRemove);
95
+ }
96
+ });
97
+ };
98
+
99
+ TunnelingAgent.prototype.createSocket = function createSocket(options, cb) {
100
+ var self = this;
101
+ var placeholder = {};
102
+ self.sockets.push(placeholder);
103
+
104
+ var connectOptions = mergeOptions({}, self.proxyOptions, {
105
+ method: 'CONNECT',
106
+ path: options.host + ':' + options.port,
107
+ agent: false
108
+ });
109
+ if (connectOptions.proxyAuth) {
110
+ connectOptions.headers = connectOptions.headers || {};
111
+ connectOptions.headers['Proxy-Authorization'] = 'Basic ' +
112
+ new Buffer(connectOptions.proxyAuth).toString('base64');
113
+ }
114
+
115
+ debug('making CONNECT request');
116
+ var connectReq = self.request(connectOptions);
117
+ connectReq.useChunkedEncodingByDefault = false; // for v0.6
118
+ connectReq.once('response', onResponse); // for v0.6
119
+ connectReq.once('upgrade', onUpgrade); // for v0.6
120
+ connectReq.once('connect', onConnect); // for v0.7 or later
121
+ connectReq.once('error', onError);
122
+ connectReq.end();
123
+
124
+ function onResponse(res) {
125
+ // Very hacky. This is necessary to avoid http-parser leaks.
126
+ res.upgrade = true;
127
+ }
128
+
129
+ function onUpgrade(res, socket, head) {
130
+ // Hacky.
131
+ process.nextTick(function() {
132
+ onConnect(res, socket, head);
133
+ });
134
+ }
135
+
136
+ function onConnect(res, socket, head) {
137
+ connectReq.removeAllListeners();
138
+ socket.removeAllListeners();
139
+
140
+ if (res.statusCode === 200) {
141
+ assert.equal(head.length, 0);
142
+ debug('tunneling connection has established');
143
+ self.sockets[self.sockets.indexOf(placeholder)] = socket;
144
+ cb(socket);
145
+ } else {
146
+ debug('tunneling socket could not be established, statusCode=%d',
147
+ res.statusCode);
148
+ var error = new Error('tunneling socket could not be established, ' +
149
+ 'sutatusCode=' + res.statusCode);
150
+ error.code = 'ECONNRESET';
151
+ options.request.emit('error', error);
152
+ self.removeSocket(placeholder);
153
+ }
154
+ }
155
+
156
+ function onError(cause) {
157
+ connectReq.removeAllListeners();
158
+
159
+ debug('tunneling socket could not be established, cause=%s\n',
160
+ cause.message, cause.stack);
161
+ var error = new Error('tunneling socket could not be established, ' +
162
+ 'cause=' + cause.message);
163
+ error.code = 'ECONNRESET';
164
+ options.request.emit('error', error);
165
+ self.removeSocket(placeholder);
166
+ }
167
+ };
168
+
169
+ TunnelingAgent.prototype.removeSocket = function removeSocket(socket) {
170
+ var pos = this.sockets.indexOf(socket)
171
+ if (pos === -1) {
172
+ return;
173
+ }
174
+ this.sockets.splice(pos, 1);
175
+
176
+ var pending = this.requests.shift();
177
+ if (pending) {
178
+ // If we have pending requests and a socket gets closed a new one
179
+ // needs to be created to take over in the pool for the one that closed.
180
+ this.createSocket(pending, function(socket) {
181
+ pending.request.onSocket(socket);
182
+ });
183
+ }
184
+ };
185
+
186
+ function createSecureSocket(options, cb) {
187
+ var self = this;
188
+ TunnelingAgent.prototype.createSocket.call(self, options, function(socket) {
189
+ // 0 is dummy port for v0.6
190
+ var secureSocket = tls.connect(0, mergeOptions({}, self.options, {
191
+ socket: socket
192
+ }));
193
+ cb(secureSocket);
194
+ });
195
+ }
196
+
197
+
198
+ function mergeOptions(target) {
199
+ for (var i = 1, len = arguments.length; i < len; ++i) {
200
+ var overrides = arguments[i];
201
+ if (typeof overrides === 'object') {
202
+ var keys = Object.keys(overrides);
203
+ for (var j = 0, keyLen = keys.length; j < keyLen; ++j) {
204
+ var k = keys[j];
205
+ if (overrides[k] !== undefined) {
206
+ target[k] = overrides[k];
207
+ }
208
+ }
209
+ }
210
+ }
211
+ return target;
212
+ }
213
+
214
+
215
+ var debug;
216
+ if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) {
217
+ debug = function() {
218
+ var args = Array.prototype.slice.call(arguments);
219
+ if (typeof args[0] === 'string') {
220
+ args[0] = 'TUNNEL: ' + args[0];
221
+ } else {
222
+ args.unshift('TUNNEL:');
223
+ }
224
+ console.error.apply(console, args);
225
+ }
226
+ } else {
227
+ debug = function() {};
228
+ }
229
+ exports.debug = debug; // for test
@@ -0,0 +1,19 @@
1
+ module.exports = function () {
2
+ var s = [], itoh = '0123456789ABCDEF';
3
+
4
+ // Make array of random hex digits. The UUID only has 32 digits in it, but we
5
+ // allocate an extra items to make room for the '-'s we'll be inserting.
6
+ for (var i = 0; i <36; i++) s[i] = Math.floor(Math.random()*0x10);
7
+
8
+ // Conform to RFC-4122, section 4.4
9
+ s[14] = 4; // Set 4 high bits of time_high field to version
10
+ s[19] = (s[19] & 0x3) | 0x8; // Specify 2 high bits of clock sequence
11
+
12
+ // Convert to hex chars
13
+ for (var i = 0; i <36; i++) s[i] = itoh[s[i]];
14
+
15
+ // Insert '-'s
16
+ s[8] = s[13] = s[18] = s[23] = '-';
17
+
18
+ return s.join('');
19
+ }
@@ -0,0 +1,65 @@
1
+ /*!
2
+ * Tobi - Cookie
3
+ * Copyright(c) 2010 LearnBoost <dev@learnboost.com>
4
+ * MIT Licensed
5
+ */
6
+
7
+ /**
8
+ * Module dependencies.
9
+ */
10
+
11
+ var url = require('url');
12
+
13
+ /**
14
+ * Initialize a new `Cookie` with the given cookie `str` and `req`.
15
+ *
16
+ * @param {String} str
17
+ * @param {IncomingRequest} req
18
+ * @api private
19
+ */
20
+
21
+ var Cookie = exports = module.exports = function Cookie(str, req) {
22
+ this.str = str;
23
+
24
+ // Map the key/val pairs
25
+ str.split(/ *; */).reduce(function(obj, pair){
26
+ var p = pair.indexOf('=');
27
+ var key = p > 0 ? pair.substring(0, p).trim() : pair.trim();
28
+ var lowerCasedKey = key.toLowerCase();
29
+ var value = p > 0 ? pair.substring(p + 1).trim() : true;
30
+
31
+ if (!obj.name) {
32
+ // First key is the name
33
+ obj.name = key;
34
+ obj.value = value;
35
+ }
36
+ else if (lowerCasedKey === 'httponly') {
37
+ obj.httpOnly = value;
38
+ }
39
+ else {
40
+ obj[lowerCasedKey] = value;
41
+ }
42
+ return obj;
43
+ }, this);
44
+
45
+ // Expires
46
+ this.expires = this.expires
47
+ ? new Date(this.expires)
48
+ : Infinity;
49
+
50
+ // Default or trim path
51
+ this.path = this.path
52
+ ? this.path.trim(): req
53
+ ? url.parse(req.url).pathname: '/';
54
+ };
55
+
56
+ /**
57
+ * Return the original cookie string.
58
+ *
59
+ * @return {String}
60
+ * @api public
61
+ */
62
+
63
+ Cookie.prototype.toString = function(){
64
+ return this.str;
65
+ };