vulcan 0.3.0 → 0.4.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 (211) hide show
  1. data/bin/vulcan +3 -1
  2. data/lib/vulcan/cli.rb +22 -3
  3. data/lib/vulcan/version.rb +1 -1
  4. data/server/bin/make +1 -3
  5. data/server/lib/spawner.js +9 -4
  6. data/server/node_modules/connect-form/node_modules/formidable/Readme.md +13 -2
  7. data/server/node_modules/connect-form/node_modules/formidable/lib/incoming_form.js +19 -7
  8. data/server/node_modules/connect-form/node_modules/formidable/lib/multipart_parser.js +12 -1
  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/file/plain.txt +1 -0
  11. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/http/no-filename/generic.http +13 -0
  12. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/http/special-chars-in-filename/osx-chrome-13.http +0 -10
  13. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-chrome-12.http +0 -9
  14. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/js/no-filename.js +3 -0
  15. data/server/node_modules/connect-form/node_modules/formidable/test/legacy/simple/test-multipart-parser.js +1 -1
  16. data/server/node_modules/cradle/lib/cradle.js +0 -1
  17. data/server/node_modules/cradle/package.json +3 -3
  18. data/server/node_modules/cradle/test/cache-test.js +6 -7
  19. data/server/node_modules/cradle/test/cradle-test.js +4 -5
  20. data/server/node_modules/cradle/test/response-test.js +5 -6
  21. data/server/node_modules/express/History.md +53 -1
  22. data/server/node_modules/express/Makefile +3 -9
  23. data/server/node_modules/express/Readme.md +3 -1
  24. data/server/node_modules/express/bin/express +65 -66
  25. data/server/node_modules/express/lib/express.js +1 -1
  26. data/server/node_modules/express/lib/request.js +23 -9
  27. data/server/node_modules/express/lib/response.js +3 -2
  28. data/server/node_modules/express/lib/utils.js +13 -0
  29. data/server/node_modules/express/lib/view/view.js +2 -1
  30. data/server/node_modules/express/lib/view.js +19 -16
  31. data/server/node_modules/express/node_modules/connect/lib/connect.js +1 -1
  32. data/server/node_modules/express/node_modules/connect/lib/http.js +2 -0
  33. data/server/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js +135 -31
  34. data/server/node_modules/express/node_modules/connect/lib/middleware/limit.js +5 -1
  35. data/server/node_modules/express/node_modules/connect/lib/middleware/session.js +2 -2
  36. data/server/node_modules/express/node_modules/connect/lib/middleware/static.js +26 -21
  37. data/server/node_modules/express/node_modules/connect/lib/middleware/staticCache.js +91 -38
  38. data/server/node_modules/express/node_modules/connect/lib/middleware/vhost.js +1 -1
  39. data/server/node_modules/express/node_modules/connect/lib/utils.js +11 -4
  40. data/server/node_modules/express/node_modules/connect/node_modules/formidable/Makefile +14 -0
  41. data/server/node_modules/express/node_modules/connect/node_modules/formidable/Readme.md +286 -0
  42. data/server/node_modules/express/node_modules/connect/node_modules/formidable/TODO +3 -0
  43. data/server/node_modules/express/node_modules/connect/node_modules/formidable/benchmark/bench-multipart-parser.js +70 -0
  44. data/server/node_modules/express/node_modules/connect/node_modules/formidable/example/post.js +43 -0
  45. data/server/node_modules/express/node_modules/connect/node_modules/formidable/example/upload.js +48 -0
  46. data/server/node_modules/express/node_modules/connect/node_modules/formidable/index.js +1 -0
  47. data/server/node_modules/express/node_modules/connect/node_modules/formidable/lib/file.js +61 -0
  48. data/server/node_modules/express/node_modules/connect/node_modules/formidable/lib/incoming_form.js +377 -0
  49. data/server/node_modules/express/node_modules/connect/node_modules/formidable/lib/index.js +3 -0
  50. data/server/node_modules/express/node_modules/connect/node_modules/formidable/lib/multipart_parser.js +312 -0
  51. data/server/node_modules/express/node_modules/connect/node_modules/formidable/lib/querystring_parser.js +25 -0
  52. data/server/node_modules/express/node_modules/connect/node_modules/formidable/lib/util.js +6 -0
  53. data/server/node_modules/express/node_modules/connect/node_modules/formidable/package.json +22 -0
  54. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/common.js +19 -0
  55. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/file/funkyfilename.txt +1 -0
  56. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/file/plain.txt +1 -0
  57. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/no-filename/generic.http +13 -0
  58. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/info.md +3 -0
  59. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/osx-chrome-13.http +26 -0
  60. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/osx-firefox-3.6.http +24 -0
  61. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/osx-safari-5.http +23 -0
  62. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-chrome-12.http +24 -0
  63. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-ie-7.http +22 -0
  64. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-ie-8.http +22 -0
  65. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-safari-5.http +22 -0
  66. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/js/no-filename.js +3 -0
  67. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/js/special-chars-in-filename.js +21 -0
  68. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/multi_video.upload +0 -0
  69. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/multipart.js +72 -0
  70. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/integration/test-fixtures.js +89 -0
  71. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/common.js +24 -0
  72. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/integration/test-multipart-parser.js +80 -0
  73. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-file.js +104 -0
  74. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-incoming-form.js +715 -0
  75. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-multipart-parser.js +50 -0
  76. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-querystring-parser.js +45 -0
  77. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/system/test-multi-video-upload.js +72 -0
  78. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/run.js +2 -0
  79. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/unit/test-incoming-form.js +63 -0
  80. data/server/node_modules/express/node_modules/connect/node_modules/formidable/tool/record.js +47 -0
  81. data/server/node_modules/express/node_modules/connect/package.json +7 -6
  82. data/server/node_modules/express/node_modules/connect/test.js +44 -31
  83. data/server/node_modules/express/node_modules/mime/mime.js +3 -3
  84. data/server/node_modules/express/node_modules/mime/package.json +21 -10
  85. data/server/node_modules/express/node_modules/mime/test.js +2 -3
  86. data/server/node_modules/express/node_modules/mime/{mime.types → types/mime.types} +0 -0
  87. data/server/node_modules/express/node_modules/mime/{node.types → types/node.types} +17 -0
  88. data/server/node_modules/express/node_modules/mkdirp/LICENSE +21 -0
  89. data/server/node_modules/express/node_modules/mkdirp/README.markdown +21 -0
  90. data/server/node_modules/express/node_modules/mkdirp/examples/pow.js +6 -0
  91. data/server/node_modules/express/node_modules/mkdirp/examples/pow.js.orig +6 -0
  92. data/server/node_modules/express/node_modules/mkdirp/examples/pow.js.rej +19 -0
  93. data/server/node_modules/express/node_modules/mkdirp/index.js +20 -0
  94. data/server/node_modules/express/node_modules/mkdirp/package.json +23 -0
  95. data/server/node_modules/express/node_modules/mkdirp/test/mkdirp.js +28 -0
  96. data/server/node_modules/express/node_modules/mkdirp/test/race.js +41 -0
  97. data/server/node_modules/express/node_modules/mkdirp/test/rel.js +32 -0
  98. data/server/node_modules/express/node_modules/qs/History.md +11 -0
  99. data/server/node_modules/express/node_modules/qs/Makefile +1 -3
  100. data/server/node_modules/express/node_modules/qs/Readme.md +2 -4
  101. data/server/node_modules/express/node_modules/qs/lib/querystring.js +100 -74
  102. data/server/node_modules/express/node_modules/qs/package.json +9 -2
  103. data/server/node_modules/express/node_modules/qs/test/mocha.opts +2 -0
  104. data/server/node_modules/express/node_modules/qs/test/{parse.test.js → parse.js} +1 -2
  105. data/server/node_modules/express/node_modules/qs/test/{stringify.test.js → stringify.js} +0 -0
  106. data/server/node_modules/express/package.json +9 -8
  107. data/server/node_modules/express/testing/foo/app.js +35 -0
  108. data/server/node_modules/express/testing/foo/package.json +9 -0
  109. data/server/node_modules/express/testing/foo/public/stylesheets/style.css +8 -0
  110. data/server/node_modules/express/testing/foo/routes/index.js +10 -0
  111. data/server/node_modules/express/testing/foo/views/index.jade +2 -0
  112. data/server/node_modules/express/testing/foo/views/layout.jade +6 -0
  113. data/server/node_modules/express/testing/index.js +43 -0
  114. data/server/node_modules/express/testing/public/test.txt +2971 -0
  115. data/server/node_modules/express/testing/views/page.html +1 -0
  116. data/server/node_modules/express/testing/views/page.jade +3 -0
  117. data/server/node_modules/express/testing/views/test.md +1 -0
  118. data/server/node_modules/express/testing/views/user/index.jade +1 -0
  119. data/server/node_modules/express/testing/views/user/list.jade +1 -0
  120. data/server/node_modules/node-uuid/README.md +166 -67
  121. data/server/node_modules/node-uuid/benchmark/README.md +53 -0
  122. data/server/node_modules/node-uuid/benchmark/bench.gnu +174 -0
  123. data/server/node_modules/node-uuid/benchmark/bench.sh +34 -0
  124. data/server/node_modules/node-uuid/{test → benchmark}/benchmark-native.c +0 -0
  125. data/server/node_modules/node-uuid/benchmark/benchmark.js +84 -0
  126. data/server/node_modules/node-uuid/package.json +5 -3
  127. data/server/node_modules/node-uuid/test/benchmark-native +0 -0
  128. data/server/node_modules/node-uuid/test/compare_v1.js +63 -0
  129. data/server/node_modules/node-uuid/test/test.html +3 -0
  130. data/server/node_modules/node-uuid/test/test.js +214 -57
  131. data/server/node_modules/node-uuid/uuid.js +225 -56
  132. data/server/node_modules/restler/README.md +20 -7
  133. data/server/node_modules/restler/bin/restler +1 -1
  134. data/server/node_modules/restler/lib/multipartform.js +9 -8
  135. data/server/node_modules/restler/lib/restler.js +64 -22
  136. data/server/node_modules/restler/package.json +2 -2
  137. data/server/node_modules/restler/test/restler.js +22 -2
  138. data/server/node_modules/restler/test/test_helper.js +20 -1
  139. data/server/package.json +1 -2
  140. data/server/web.js +30 -7
  141. metadata +90 -86
  142. data/server/node_modules/cradle/node_modules/vows/LICENSE +0 -20
  143. data/server/node_modules/cradle/node_modules/vows/Makefile +0 -7
  144. data/server/node_modules/cradle/node_modules/vows/README.md +0 -39
  145. data/server/node_modules/cradle/node_modules/vows/bin/vows +0 -515
  146. data/server/node_modules/cradle/node_modules/vows/lib/assert/error.js +0 -27
  147. data/server/node_modules/cradle/node_modules/vows/lib/assert/macros.js +0 -215
  148. data/server/node_modules/cradle/node_modules/vows/lib/assert/utils.js +0 -77
  149. data/server/node_modules/cradle/node_modules/vows/lib/vows/console.js +0 -131
  150. data/server/node_modules/cradle/node_modules/vows/lib/vows/context.js +0 -55
  151. data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/file.js +0 -29
  152. data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/fragments/coverage-foot.html +0 -2
  153. data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/fragments/coverage-head.html +0 -61
  154. data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/report-html.js +0 -54
  155. data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/report-json.js +0 -54
  156. data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/report-plain.js +0 -38
  157. data/server/node_modules/cradle/node_modules/vows/lib/vows/extras.js +0 -28
  158. data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/dot-matrix.js +0 -67
  159. data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/json.js +0 -16
  160. data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/silent.js +0 -8
  161. data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/spec.js +0 -44
  162. data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/watch.js +0 -39
  163. data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/xunit.js +0 -90
  164. data/server/node_modules/cradle/node_modules/vows/lib/vows/suite.js +0 -319
  165. data/server/node_modules/cradle/node_modules/vows/lib/vows.js +0 -193
  166. data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/LICENSE +0 -20
  167. data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/Makefile +0 -4
  168. data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/README.md +0 -72
  169. data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/lib/eyes.js +0 -233
  170. data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/package.json +0 -14
  171. data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/test/eyes-test.js +0 -55
  172. data/server/node_modules/cradle/node_modules/vows/package.json +0 -14
  173. data/server/node_modules/cradle/node_modules/vows/test/assert-test.js +0 -135
  174. data/server/node_modules/cradle/node_modules/vows/test/fixtures/isolate/failing.js +0 -18
  175. data/server/node_modules/cradle/node_modules/vows/test/fixtures/isolate/log.js +0 -18
  176. data/server/node_modules/cradle/node_modules/vows/test/fixtures/isolate/passing.js +0 -17
  177. data/server/node_modules/cradle/node_modules/vows/test/fixtures/isolate/stderr.js +0 -18
  178. data/server/node_modules/cradle/node_modules/vows/test/isolate-test.js +0 -140
  179. data/server/node_modules/cradle/node_modules/vows/test/testInherit.js +0 -133
  180. data/server/node_modules/cradle/node_modules/vows/test/vows-error-test.js +0 -51
  181. data/server/node_modules/cradle/node_modules/vows/test/vows-test.js +0 -374
  182. data/server/node_modules/express/node_modules/mime/index.js +0 -1
  183. data/server/node_modules/express/node_modules/qs/support/expresso/History.md +0 -128
  184. data/server/node_modules/express/node_modules/qs/support/expresso/Makefile +0 -53
  185. data/server/node_modules/express/node_modules/qs/support/expresso/Readme.md +0 -61
  186. data/server/node_modules/express/node_modules/qs/support/expresso/bin/expresso +0 -856
  187. data/server/node_modules/express/node_modules/qs/support/expresso/docs/api.html +0 -1080
  188. data/server/node_modules/express/node_modules/qs/support/expresso/docs/index.html +0 -377
  189. data/server/node_modules/express/node_modules/qs/support/expresso/docs/index.md +0 -290
  190. data/server/node_modules/express/node_modules/qs/support/expresso/docs/layout/foot.html +0 -3
  191. data/server/node_modules/express/node_modules/qs/support/expresso/docs/layout/head.html +0 -42
  192. data/server/node_modules/express/node_modules/qs/support/expresso/lib/bar.js +0 -4
  193. data/server/node_modules/express/node_modules/qs/support/expresso/lib/foo.js +0 -16
  194. data/server/node_modules/express/node_modules/qs/support/expresso/package.json +0 -12
  195. data/server/node_modules/express/node_modules/qs/support/expresso/test/assert.test.js +0 -91
  196. data/server/node_modules/express/node_modules/qs/support/expresso/test/async.test.js +0 -12
  197. data/server/node_modules/express/node_modules/qs/support/expresso/test/bar.test.js +0 -13
  198. data/server/node_modules/express/node_modules/qs/support/expresso/test/foo.test.js +0 -14
  199. data/server/node_modules/express/node_modules/qs/support/expresso/test/http.test.js +0 -146
  200. data/server/node_modules/express/node_modules/qs/support/expresso/test/serial/async.test.js +0 -39
  201. data/server/node_modules/express/node_modules/qs/support/expresso/test/serial/http.test.js +0 -48
  202. data/server/node_modules/express/node_modules/qs/support/should/History.md +0 -22
  203. data/server/node_modules/express/node_modules/qs/support/should/Makefile +0 -6
  204. data/server/node_modules/express/node_modules/qs/support/should/Readme.md +0 -248
  205. data/server/node_modules/express/node_modules/qs/support/should/examples/runner.js +0 -53
  206. data/server/node_modules/express/node_modules/qs/support/should/index.js +0 -2
  207. data/server/node_modules/express/node_modules/qs/support/should/lib/eql.js +0 -91
  208. data/server/node_modules/express/node_modules/qs/support/should/lib/should.js +0 -548
  209. data/server/node_modules/express/node_modules/qs/support/should/package.json +0 -8
  210. data/server/node_modules/express/node_modules/qs/support/should/test/should.test.js +0 -358
  211. data/server/node_modules/node-uuid/test/benchmark.js +0 -27
@@ -1,10 +1,12 @@
1
- Restler 0.2.0
1
+ Restler 0.2.4
2
2
  ===========
3
3
 
4
4
  (C) Dan Webb (dan@danwebb.net/@danwrong) 2011, Licensed under the MIT-LICENSE
5
5
 
6
6
  An HTTP client library for node.js (0.3 and up). Hides most of the complexity of creating and using http.Client. Very early days yet.
7
7
 
8
+ See [Version History](https://github.com/danwrong/restler/wiki/Version-History) for changes
9
+
8
10
 
9
11
  Features
10
12
  --------
@@ -19,8 +21,9 @@ Features
19
21
  * Transparently handle SSL (just specify https in the URL)
20
22
  * Deals with basic auth for you, just provide username and password options
21
23
  * Simple service wrapper that allows you to easily put together REST API libraries
22
-
23
-
24
+ * Transparently handle content-encoded responses (gzip, deflate)
25
+
26
+
24
27
  API
25
28
  ---
26
29
 
@@ -68,9 +71,12 @@ All of these attempt to turn the response into a JavaScript object. In order to
68
71
 
69
72
  * _method_ Request method, can be get, post, put, del
70
73
  * _query_ Query string variables as a javascript object, will override the querystring in the URL
71
- * _data_ The data to be added to the body of the request. Can be a string or any object
74
+ * _data_ The data to be added to the body of the request. Can be a string or any object.
75
+ Note that if you want your request body to be JSON with the Content-Type `application/json`, you need to
76
+ JSON.stringify your object first. Otherwise, it will be sent as `application/x-www-form-urlencoded` and encoded accordingly.
72
77
  * _parser_ A function that will be called on the returned data. try parsers.auto, parsers.json etc
73
78
  * _encoding_ The encoding of the request body. defaults to utf8
79
+ * _decoding_ The encoding of the response body. For a list of supported values see [Buffers](http://nodejs.org/docs/latest/api/buffers.html#buffers). Additionally accepts `"buffer"` - returns response as `Buffer`. Defaults to `utf8`.
74
80
  * _headers_ a hash of HTTP headers to be sent
75
81
  * _username_ Basic auth username
76
82
  * _password_ Basic auth password
@@ -82,7 +88,7 @@ All of these attempt to turn the response into a JavaScript object. In order to
82
88
  Example usage
83
89
  -------------
84
90
 
85
- var sys = require('sys'),
91
+ var sys = require('util'),
86
92
  rest = require('./restler');
87
93
 
88
94
  rest.get('http://google.com').on('complete', function(data) {
@@ -112,7 +118,7 @@ Example usage
112
118
  password: 'wouldntyouliketoknow',
113
119
  data: {
114
120
  'sound[message]': 'hello from restler!',
115
- 'sound[file]': rest.file('doug-e-fresh_the-show.mp3', 'audio/mpeg')
121
+ 'sound[file]': rest.file('doug-e-fresh_the-show.mp3', null, null, null, 'audio/mpeg')
116
122
  }
117
123
  }).on('complete', function(data) {
118
124
  sys.puts(data.audio_url);
@@ -135,6 +141,13 @@ Example usage
135
141
  sys.p(data);
136
142
  });
137
143
 
144
+ // the JSON post
145
+ rest.post('http://example.com/action', {
146
+ data: JSON.stringify({ id: 334 }),
147
+ }).on('complete', function(data, response) {
148
+ // you can get at the raw response like this...
149
+ });
150
+
138
151
 
139
152
  Running the tests
140
153
  -----------------
@@ -144,4 +157,4 @@ Running the tests
144
157
  TODO
145
158
  ----
146
159
  * Deal with no utf-8 response bodies
147
- * What do you need? Let me know or fork.
160
+ * What do you need? Let me know or fork.
@@ -2,7 +2,7 @@
2
2
 
3
3
  require.paths.push(process.cwd());
4
4
 
5
- var sys = require('sys'),
5
+ var sys = require('util'),
6
6
  rest = require('../lib/restler'),
7
7
  repl = require('repl');
8
8
 
@@ -1,5 +1,5 @@
1
1
  var fs = require('fs');
2
- var sys = require("sys")
2
+ var sys = require('util')
3
3
  exports.defaultBoundary = '48940923NODERESLTER3890457293';
4
4
 
5
5
 
@@ -109,7 +109,7 @@ Part.prototype = {
109
109
  fs.open(this.value.path, "r", 0666, function (err, fd) {
110
110
  if (err) throw err;
111
111
 
112
- position = 0;
112
+ var position = 0;
113
113
 
114
114
  (function reader () {
115
115
  fs.read(fd, 1024 * 4, position, "binary", function (er, chunk) {
@@ -142,12 +142,13 @@ function MultiPartRequest(data, boundary) {
142
142
 
143
143
  MultiPartRequest.prototype = {
144
144
  _partNames: function() {
145
- partNames = []
146
- for (var name in this.data) {
147
- partNames.push(name)
145
+ var partNames = [];
146
+ for (var name in this.data) {
147
+ partNames.push(name)
148
148
  }
149
149
  return partNames;
150
150
  },
151
+
151
152
  write: function(stream, callback) {
152
153
  var partCount = 0, self = this;
153
154
 
@@ -157,8 +158,8 @@ MultiPartRequest.prototype = {
157
158
 
158
159
  // Let each part write itself out to the stream
159
160
  (function writePart() {
160
- partName = this.partNames[partCount];
161
- part = new Part(partName, self.data[partName], self.boundary);
161
+ var partName = self.partNames[partCount];
162
+ var part = new Part(partName, self.data[partName], self.boundary);
162
163
  part.write(stream, function (err) {
163
164
  if (err) {
164
165
  callback(err);
@@ -199,4 +200,4 @@ var exportMethods = {
199
200
 
200
201
  Object.keys(exportMethods).forEach(function(exportMethod) {
201
202
  exports[exportMethod] = exportMethods[exportMethod]
202
- })
203
+ })
@@ -1,9 +1,10 @@
1
- var sys = require('sys'),
1
+ var sys = require('util'),
2
2
  http = require('http'),
3
3
  https = require('https'),
4
4
  url = require('url'),
5
5
  qs = require('querystring'),
6
- multipart = require('./multipartform');
6
+ multipart = require('./multipartform'),
7
+ zlib = require('zlib');
7
8
 
8
9
  function mixin(target, source) {
9
10
  Object.keys(source).forEach(function(key) {
@@ -20,7 +21,7 @@ function Request(uri, options) {
20
21
  'Accept': '*/*',
21
22
  'User-Agent': 'Restler for node.js',
22
23
  'Host': this.url.host
23
- }
24
+ };
24
25
 
25
26
  mixin(this.headers, options.headers || {});
26
27
 
@@ -46,6 +47,11 @@ function Request(uri, options) {
46
47
  this.headers['Content-Type'] = 'application/x-www-form-urlencoded';
47
48
  this.headers['Content-Length'] = this.options.data.length;
48
49
  }
50
+ if(typeof this.options.data == 'string') {
51
+ var buffer = new Buffer(this.options.data, this.options.encoding || 'utf8');
52
+ this.options.data = buffer;
53
+ this.headers['Content-Length'] = buffer.length;
54
+ }
49
55
  }
50
56
 
51
57
  var proto = (this.url.protocol == 'https:') ? https : http;
@@ -62,9 +68,10 @@ function Request(uri, options) {
62
68
  }
63
69
 
64
70
  Request.prototype = new process.EventEmitter();
71
+
65
72
  mixin(Request.prototype, {
66
73
  _isRedirect: function(response) {
67
- return ([301, 302].indexOf(response.statusCode) >= 0);
74
+ return ([301, 302, 303].indexOf(response.statusCode) >= 0);
68
75
  },
69
76
  _fullPath: function() {
70
77
  var path = this.url.pathname || '/';
@@ -101,25 +108,46 @@ mixin(Request.prototype, {
101
108
  } else {
102
109
  var body = '';
103
110
 
104
- // TODO Handle different encodings
105
- response.setEncoding('utf8');
111
+ response.setEncoding('binary');
106
112
 
107
113
  response.on('data', function(chunk) {
108
114
  body += chunk;
109
115
  });
110
116
 
111
117
  response.on('end', function() {
112
- if (self.options.parser) {
113
- self.options.parser.call(response, body, function(parsedData) {
114
-
115
- self._fireEvents(parsedData, response);
116
- });
117
- } else {
118
- self._fireEvents(body, response);
119
- }
118
+ self._decode(new Buffer(body, 'binary'), response, function(err, body) {
119
+ if (err) {
120
+ self._respond('error', '', 'Failed to decode response body');
121
+ return;
122
+ }
123
+ self._encode(body, response, function(body) {
124
+ self._fireEvents(body, response);
125
+ });
126
+ });
120
127
  });
121
128
  }
122
129
  },
130
+ _decode: function(body, response, callback) {
131
+ var encoder = response.headers['content-encoding'];
132
+ if (encoder in decoders) {
133
+ decoders[encoder].call(response, body, callback);
134
+ } else {
135
+ callback(null, body);
136
+ }
137
+ },
138
+ _encode: function(body, response, callback) {
139
+ var self = this;
140
+ if (self.options.decoding == 'buffer') {
141
+ callback(body);
142
+ } else {
143
+ body = body.toString(self.options.decoding);
144
+ if (self.options.parser) {
145
+ self.options.parser.call(response, body, callback);
146
+ } else {
147
+ callback(body);
148
+ }
149
+ }
150
+ },
123
151
  _respond: function(type, data, response) {
124
152
  if (this.options.originalRequest) {
125
153
  this.options.originalRequest.emit(type, data, response);
@@ -135,11 +163,11 @@ mixin(Request.prototype, {
135
163
  this._respond(response.statusCode.toString(), body, response);
136
164
  this._respond('complete', body, response);
137
165
  },
138
- _makeRequest: function() {
166
+ _makeRequest: function() {
139
167
  var self = this;
140
168
 
141
169
  this.request.on('response', function(response) {
142
- self._responseHandler(response);
170
+ self._responseHandler(response);
143
171
  }).on('error', function(err) {
144
172
  self._respond('error', null, err);
145
173
  });
@@ -155,7 +183,7 @@ mixin(Request.prototype, {
155
183
  if (this.options.data) {
156
184
  this.request.write(this.options.data.toString(), this.options.encoding || 'utf8');
157
185
  }
158
- this.request.end();
186
+ this.request.end();
159
187
  }
160
188
 
161
189
  return this;
@@ -170,7 +198,9 @@ function shortcutOptions(options, method) {
170
198
  }
171
199
 
172
200
  function request(url, options) {
173
- return (new Request(url, options)).run();
201
+ var request = new Request(url, options);
202
+ request.on('error', function() {});
203
+ return request.run();
174
204
  }
175
205
 
176
206
  function get(url, options) {
@@ -207,7 +237,7 @@ var parsers = {
207
237
  json: function(data, callback) {
208
238
  callback(data && JSON.parse(data));
209
239
  }
210
- }
240
+ };
211
241
 
212
242
  parsers.auto.matchers = {
213
243
  'application/json': parsers.json
@@ -233,15 +263,27 @@ try {
233
263
  parser.on('end', function(result) {
234
264
  callback(result);
235
265
  });
236
-
237
- parser.parseString(data);
266
+ try {
267
+ parser.parseString(data);
268
+ } catch (e) {
269
+ callback({error:'Oops, something went wrong.'});
270
+ }
238
271
  } else {
239
272
  callback();
240
273
  }
241
274
  };
242
275
 
243
276
  parsers.auto.matchers['application/xml'] = parsers.xml;
244
- } catch(e) {}
277
+ } catch(e) { }
278
+
279
+ var decoders = {
280
+ gzip: function(buf, callback) {
281
+ zlib.gunzip(buf, callback);
282
+ },
283
+ deflate: function(buf, callback) {
284
+ zlib.inflate(buf, callback);
285
+ }
286
+ };
245
287
 
246
288
 
247
289
  function Service(defaults) {
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "restler",
3
- "version": "0.2.1",
3
+ "version": "0.2.4",
4
4
  "description": "An HTTP client library for node.js",
5
5
  "contributors": [{ "name": "Dan Webb", "email": "dan@danwebb.net" }],
6
6
  "homepage": "https://github.com/danwrong/restler",
7
7
  "directories" : { "lib" : "./lib" },
8
8
  "main" : "./lib/restler",
9
9
  "engines": { "node": ">= 0.3.7" }
10
- }
10
+ }
@@ -1,6 +1,6 @@
1
1
  var helper = require('./test_helper'),
2
2
  rest = require('../lib/restler'),
3
- sys = require('sys');
3
+ sys = require('util');
4
4
 
5
5
  helper.testCase("Basic Tests", helper.echoServer, {
6
6
  testRequestShouldTakePath: function(host, test) {
@@ -145,4 +145,24 @@ helper.testCase('Redirect Tests', helper.redirectServer, {
145
145
  test.equal('Hell Yeah!', data, "returned " + sys.inspect(data));
146
146
  });
147
147
  }
148
- });
148
+ });
149
+
150
+ helper.testCase('Content-Length Tests', helper.contentLengthServer, {
151
+ testRequestHeaderIncludesContentLengthWithJSONData: function(host, test){
152
+ var jsonString = JSON.stringify({ greeting: 'hello world' });
153
+ rest.post(host, {
154
+ data: jsonString
155
+ }).on('complete', function(data){
156
+ test.equal(26, data, 'should set content-length');
157
+ });
158
+ },
159
+ testJSONMultibyteContentLength: function (host, test){
160
+ var multibyteData = JSON.stringify({ greeting: 'こんにちは世界' });
161
+ rest.post(host, {
162
+ data: multibyteData
163
+ }).on('complete', function(data) {
164
+ test.notEqual(22, data, 'should unicode string length');
165
+ test.equal(36, data, 'should byte-size content-length');
166
+ });
167
+ }
168
+ });
@@ -1,5 +1,5 @@
1
1
  var http = require("http"),
2
- sys = require('sys'),
2
+ sys = require('util'),
3
3
  test = require('assert');
4
4
 
5
5
  exports.echoServer = function() {
@@ -84,6 +84,25 @@ exports.redirectServer = function() {
84
84
  return ["http://localhost:" + port, server];
85
85
  }
86
86
 
87
+ exports.contentLengthServer = function (){
88
+ var port = exports.port++;
89
+
90
+ var server = http.createServer(function(request, response){
91
+ response.writeHead(200, { 'Content-Type': 'text/plain' });
92
+ if('content-length' in request.headers){
93
+ response.write(request.headers['content-length']);
94
+ } else {
95
+ response.write('content-length isnot set');
96
+ }
97
+
98
+ response.end();
99
+ server.close();
100
+ });
101
+
102
+ server.listen(port, 'localhost');
103
+ return ['http://localhost:' + port, server];
104
+ };
105
+
87
106
  exports.port = 7000;
88
107
 
89
108
  exports.testCase = function(caseName, serverFunc, tests) {
data/server/package.json CHANGED
@@ -10,7 +10,6 @@
10
10
  "restler"
11
11
  ],
12
12
  "engines": {
13
- "node": ">=0.4.7 <0.6.0",
14
- "npm": ">=1.0.0"
13
+ "node": "0.6.x"
15
14
  }
16
15
  }
data/server/web.js CHANGED
@@ -1,10 +1,8 @@
1
- require.paths.unshift(__dirname + '/lib');
2
-
3
1
  var cradle = require('cradle');
4
2
  var express = require('express');
5
3
  var fs = require('fs');
6
4
  var spawner = require('spawner').create();
7
- var sys = require('sys');
5
+ var util = require('util');
8
6
  var uuid = require('node-uuid');
9
7
 
10
8
  var app = express.createServer(
@@ -14,6 +12,14 @@ var app = express.createServer(
14
12
  require('connect-form')({ keepExtensions: true })
15
13
  );
16
14
 
15
+ function log_action(uuid, message) {
16
+ console.log(uuid + ': ' + message);
17
+ }
18
+
19
+ function log_error(uuid, message) {
20
+ log_action(uuid, 'ERROR: ' + message);
21
+ }
22
+
17
23
  // connect to couchdb
18
24
  var couchdb_url = require('url').parse(process.env.CLOUDANT_URL);
19
25
  var couchdb_options = couchdb_url.auth ?
@@ -27,6 +33,7 @@ app.post('/make', function(request, response, next) {
27
33
 
28
34
  // require a form
29
35
  if (! request.form) {
36
+ console.log('invalid form');
30
37
  response.write('invalid form');
31
38
  response.send(500);
32
39
  } else {
@@ -48,10 +55,12 @@ app.post('/make', function(request, response, next) {
48
55
  var prefix = fields.prefix;
49
56
 
50
57
  // create a couchdb documents for this build
58
+ log_action(id, 'saving to couchdb');
51
59
  db.save(id, { command:command, prefix:prefix }, function(err, doc) {
52
- if (err) { return next(err); }
60
+ if (err) { log_error(id, util.inspect(err)); return next(err); }
53
61
 
54
62
  // save the input tarball as an attachment
63
+ log_action(id, 'saving attachment - [id:' + doc.id + ', rev:' + doc.rev + ']')
55
64
  db.saveAttachment(
56
65
  doc.id,
57
66
  doc.rev,
@@ -59,16 +68,26 @@ app.post('/make', function(request, response, next) {
59
68
  'application/octet-stream',
60
69
  fs.createReadStream(files.code.path),
61
70
  function(err, data) {
62
- if (err) { return next(err); }
71
+ if (err) {
72
+ // work around temporary problem with cloudant and document
73
+ // conflicts
74
+ if (err.error != 'conflict') {
75
+ log_error(id, err.reason);
76
+ return next(err.reason);
77
+ }
78
+ }
63
79
 
64
80
  // spawn bin/make with this build id
81
+ log_action(id, 'spawning build');
65
82
  var ls = spawner.spawn('bin/make ' + id, function(err) {
83
+ log_error(id, 'could not spawn: ' + err);
66
84
  response.write('could not spawn: ' + err);
67
85
  response.send(500);
68
86
  });
69
87
 
70
88
  ls.on('error', function(error) {
71
- response.write('error: ' + err);
89
+ log_error(id, 'spawn error: ' + util.inspect(error));
90
+ response.write('error: ' + util.inspect(error));
72
91
  response.send(500);
73
92
  });
74
93
 
@@ -86,7 +105,7 @@ app.post('/make', function(request, response, next) {
86
105
  response.header('X-Make-Id', id);
87
106
  });
88
107
  }
89
-
108
+
90
109
  });
91
110
  }
92
111
  });
@@ -97,6 +116,10 @@ app.get('/output/:id', function(request, response, next) {
97
116
  // from couchdb
98
117
  var stream = db.getAttachment(request.params.id, 'output');
99
118
 
119
+ stream.on('error', function(err) {
120
+ console.log('download error: ' + err);
121
+ });
122
+
100
123
  stream.on('data', function(chunk) {
101
124
  response.write(chunk, 'binary');
102
125
  });