vulcan 0.1.6 → 0.2.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 (181) hide show
  1. data/lib/vulcan/cli.rb +3 -0
  2. data/lib/vulcan/version.rb +1 -1
  3. data/server/lib/spawner.js +9 -4
  4. data/server/node_modules/cradle/lib/cradle.js +0 -1
  5. data/server/node_modules/cradle/package.json +3 -3
  6. data/server/node_modules/cradle/test/cache-test.js +6 -7
  7. data/server/node_modules/cradle/test/cradle-test.js +4 -5
  8. data/server/node_modules/cradle/test/response-test.js +5 -6
  9. data/server/node_modules/express/History.md +40 -0
  10. data/server/node_modules/express/Makefile +3 -9
  11. data/server/node_modules/express/Readme.md +3 -1
  12. data/server/node_modules/express/bin/express +61 -63
  13. data/server/node_modules/express/lib/express.js +1 -1
  14. data/server/node_modules/express/lib/request.js +9 -7
  15. data/server/node_modules/express/lib/view.js +19 -16
  16. data/server/node_modules/express/node_modules/connect/lib/connect.js +1 -1
  17. data/server/node_modules/express/node_modules/connect/lib/http.js +2 -0
  18. data/server/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js +135 -31
  19. data/server/node_modules/express/node_modules/connect/lib/middleware/limit.js +5 -1
  20. data/server/node_modules/express/node_modules/connect/lib/middleware/session.js +2 -2
  21. data/server/node_modules/express/node_modules/connect/lib/middleware/static.js +26 -21
  22. data/server/node_modules/express/node_modules/connect/lib/middleware/staticCache.js +91 -38
  23. data/server/node_modules/express/node_modules/connect/lib/middleware/vhost.js +1 -1
  24. data/server/node_modules/express/node_modules/connect/lib/utils.js +11 -4
  25. data/server/node_modules/express/node_modules/connect/node_modules/formidable/Makefile +14 -0
  26. data/server/node_modules/express/node_modules/connect/node_modules/formidable/Readme.md +286 -0
  27. data/server/node_modules/express/node_modules/connect/node_modules/formidable/TODO +3 -0
  28. data/server/node_modules/express/node_modules/connect/node_modules/formidable/benchmark/bench-multipart-parser.js +70 -0
  29. data/server/node_modules/express/node_modules/connect/node_modules/formidable/example/post.js +43 -0
  30. data/server/node_modules/express/node_modules/connect/node_modules/formidable/example/upload.js +48 -0
  31. data/server/node_modules/express/node_modules/connect/node_modules/formidable/index.js +1 -0
  32. data/server/node_modules/express/node_modules/connect/node_modules/formidable/lib/file.js +61 -0
  33. data/server/node_modules/express/node_modules/connect/node_modules/formidable/lib/incoming_form.js +377 -0
  34. data/server/node_modules/express/node_modules/connect/node_modules/formidable/lib/index.js +3 -0
  35. data/server/node_modules/express/node_modules/connect/node_modules/formidable/lib/multipart_parser.js +312 -0
  36. data/server/node_modules/express/node_modules/connect/node_modules/formidable/lib/querystring_parser.js +25 -0
  37. data/server/node_modules/express/node_modules/connect/node_modules/formidable/lib/util.js +6 -0
  38. data/server/node_modules/express/node_modules/connect/node_modules/formidable/package.json +22 -0
  39. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/common.js +19 -0
  40. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/file/funkyfilename.txt +1 -0
  41. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/file/plain.txt +1 -0
  42. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/no-filename/generic.http +13 -0
  43. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/info.md +3 -0
  44. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/osx-chrome-13.http +26 -0
  45. 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
  46. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/osx-safari-5.http +23 -0
  47. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-chrome-12.http +24 -0
  48. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-ie-7.http +22 -0
  49. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-ie-8.http +22 -0
  50. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-safari-5.http +22 -0
  51. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/js/no-filename.js +3 -0
  52. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/js/special-chars-in-filename.js +21 -0
  53. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/multi_video.upload +0 -0
  54. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/multipart.js +72 -0
  55. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/integration/test-fixtures.js +89 -0
  56. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/common.js +24 -0
  57. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/integration/test-multipart-parser.js +80 -0
  58. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-file.js +104 -0
  59. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-incoming-form.js +715 -0
  60. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-multipart-parser.js +50 -0
  61. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-querystring-parser.js +45 -0
  62. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/system/test-multi-video-upload.js +72 -0
  63. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/run.js +2 -0
  64. data/server/node_modules/express/node_modules/connect/node_modules/formidable/test/unit/test-incoming-form.js +63 -0
  65. data/server/node_modules/express/node_modules/connect/node_modules/formidable/tool/record.js +47 -0
  66. data/server/node_modules/express/node_modules/connect/package.json +7 -6
  67. data/server/node_modules/express/node_modules/connect/test.js +44 -31
  68. data/server/node_modules/express/node_modules/qs/History.md +11 -0
  69. data/server/node_modules/express/node_modules/qs/Makefile +1 -3
  70. data/server/node_modules/express/node_modules/qs/Readme.md +2 -4
  71. data/server/node_modules/express/node_modules/qs/lib/querystring.js +100 -74
  72. data/server/node_modules/express/node_modules/qs/package.json +9 -2
  73. data/server/node_modules/express/node_modules/qs/test/mocha.opts +2 -0
  74. data/server/node_modules/express/node_modules/qs/test/{parse.test.js → parse.js} +1 -2
  75. data/server/node_modules/express/node_modules/qs/test/{stringify.test.js → stringify.js} +0 -0
  76. data/server/node_modules/express/package.json +7 -7
  77. data/server/node_modules/express/testing/foo/app.js +35 -0
  78. data/server/node_modules/express/testing/foo/package.json +9 -0
  79. data/server/node_modules/express/testing/foo/public/stylesheets/style.css +8 -0
  80. data/server/node_modules/express/testing/foo/routes/index.js +10 -0
  81. data/server/node_modules/express/testing/foo/views/index.jade +2 -0
  82. data/server/node_modules/express/testing/foo/views/layout.jade +6 -0
  83. data/server/node_modules/express/testing/index.js +31 -5
  84. data/server/node_modules/express/testing/public/test.txt +2971 -0
  85. data/server/node_modules/express/testing/views/page.html +1 -0
  86. data/server/node_modules/express/testing/views/page.jade +3 -0
  87. data/server/node_modules/express/testing/views/test.md +1 -0
  88. data/server/node_modules/express/testing/views/user/index.jade +1 -0
  89. data/server/node_modules/express/testing/views/user/list.jade +1 -0
  90. data/server/node_modules/node-uuid/README.md +166 -67
  91. data/server/node_modules/node-uuid/benchmark/README.md +53 -0
  92. data/server/node_modules/node-uuid/benchmark/bench.gnu +174 -0
  93. data/server/node_modules/node-uuid/benchmark/bench.sh +34 -0
  94. data/server/node_modules/node-uuid/{test → benchmark}/benchmark-native.c +0 -0
  95. data/server/node_modules/node-uuid/benchmark/benchmark.js +84 -0
  96. data/server/node_modules/node-uuid/package.json +5 -3
  97. data/server/node_modules/node-uuid/test/benchmark-native +0 -0
  98. data/server/node_modules/node-uuid/test/compare_v1.js +63 -0
  99. data/server/node_modules/node-uuid/test/test.html +3 -0
  100. data/server/node_modules/node-uuid/test/test.js +214 -57
  101. data/server/node_modules/node-uuid/uuid.js +225 -56
  102. data/server/node_modules/restler/README.md +20 -7
  103. data/server/node_modules/restler/bin/restler +1 -1
  104. data/server/node_modules/restler/lib/multipartform.js +9 -8
  105. data/server/node_modules/restler/lib/restler.js +64 -22
  106. data/server/node_modules/restler/package.json +2 -2
  107. data/server/node_modules/restler/test/restler.js +22 -2
  108. data/server/node_modules/restler/test/test_helper.js +20 -1
  109. data/server/package.json +8 -8
  110. data/server/web.js +22 -6
  111. metadata +72 -82
  112. data/server/node_modules/cradle/node_modules/vows/LICENSE +0 -20
  113. data/server/node_modules/cradle/node_modules/vows/Makefile +0 -7
  114. data/server/node_modules/cradle/node_modules/vows/README.md +0 -39
  115. data/server/node_modules/cradle/node_modules/vows/bin/vows +0 -515
  116. data/server/node_modules/cradle/node_modules/vows/lib/assert/error.js +0 -27
  117. data/server/node_modules/cradle/node_modules/vows/lib/assert/macros.js +0 -215
  118. data/server/node_modules/cradle/node_modules/vows/lib/assert/utils.js +0 -77
  119. data/server/node_modules/cradle/node_modules/vows/lib/vows.js +0 -193
  120. data/server/node_modules/cradle/node_modules/vows/lib/vows/console.js +0 -131
  121. data/server/node_modules/cradle/node_modules/vows/lib/vows/context.js +0 -55
  122. data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/file.js +0 -29
  123. data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/fragments/coverage-foot.html +0 -2
  124. data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/fragments/coverage-head.html +0 -61
  125. data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/report-html.js +0 -54
  126. data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/report-json.js +0 -54
  127. data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/report-plain.js +0 -38
  128. data/server/node_modules/cradle/node_modules/vows/lib/vows/extras.js +0 -28
  129. data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/dot-matrix.js +0 -67
  130. data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/json.js +0 -16
  131. data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/silent.js +0 -8
  132. data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/spec.js +0 -44
  133. data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/watch.js +0 -39
  134. data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/xunit.js +0 -90
  135. data/server/node_modules/cradle/node_modules/vows/lib/vows/suite.js +0 -319
  136. data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/LICENSE +0 -20
  137. data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/Makefile +0 -4
  138. data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/README.md +0 -72
  139. data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/lib/eyes.js +0 -233
  140. data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/package.json +0 -14
  141. data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/test/eyes-test.js +0 -55
  142. data/server/node_modules/cradle/node_modules/vows/package.json +0 -14
  143. data/server/node_modules/cradle/node_modules/vows/test/assert-test.js +0 -135
  144. data/server/node_modules/cradle/node_modules/vows/test/fixtures/isolate/failing.js +0 -18
  145. data/server/node_modules/cradle/node_modules/vows/test/fixtures/isolate/log.js +0 -18
  146. data/server/node_modules/cradle/node_modules/vows/test/fixtures/isolate/passing.js +0 -17
  147. data/server/node_modules/cradle/node_modules/vows/test/fixtures/isolate/stderr.js +0 -18
  148. data/server/node_modules/cradle/node_modules/vows/test/isolate-test.js +0 -140
  149. data/server/node_modules/cradle/node_modules/vows/test/testInherit.js +0 -133
  150. data/server/node_modules/cradle/node_modules/vows/test/vows-error-test.js +0 -51
  151. data/server/node_modules/cradle/node_modules/vows/test/vows-test.js +0 -374
  152. data/server/node_modules/express/node_modules/qs/support/expresso/History.md +0 -128
  153. data/server/node_modules/express/node_modules/qs/support/expresso/Makefile +0 -53
  154. data/server/node_modules/express/node_modules/qs/support/expresso/Readme.md +0 -61
  155. data/server/node_modules/express/node_modules/qs/support/expresso/bin/expresso +0 -856
  156. data/server/node_modules/express/node_modules/qs/support/expresso/docs/api.html +0 -1080
  157. data/server/node_modules/express/node_modules/qs/support/expresso/docs/index.html +0 -377
  158. data/server/node_modules/express/node_modules/qs/support/expresso/docs/index.md +0 -290
  159. data/server/node_modules/express/node_modules/qs/support/expresso/docs/layout/foot.html +0 -3
  160. data/server/node_modules/express/node_modules/qs/support/expresso/docs/layout/head.html +0 -42
  161. data/server/node_modules/express/node_modules/qs/support/expresso/lib/bar.js +0 -4
  162. data/server/node_modules/express/node_modules/qs/support/expresso/lib/foo.js +0 -16
  163. data/server/node_modules/express/node_modules/qs/support/expresso/package.json +0 -12
  164. data/server/node_modules/express/node_modules/qs/support/expresso/test/assert.test.js +0 -91
  165. data/server/node_modules/express/node_modules/qs/support/expresso/test/async.test.js +0 -12
  166. data/server/node_modules/express/node_modules/qs/support/expresso/test/bar.test.js +0 -13
  167. data/server/node_modules/express/node_modules/qs/support/expresso/test/foo.test.js +0 -14
  168. data/server/node_modules/express/node_modules/qs/support/expresso/test/http.test.js +0 -146
  169. data/server/node_modules/express/node_modules/qs/support/expresso/test/serial/async.test.js +0 -39
  170. data/server/node_modules/express/node_modules/qs/support/expresso/test/serial/http.test.js +0 -48
  171. data/server/node_modules/express/node_modules/qs/support/should/History.md +0 -22
  172. data/server/node_modules/express/node_modules/qs/support/should/Makefile +0 -6
  173. data/server/node_modules/express/node_modules/qs/support/should/Readme.md +0 -248
  174. data/server/node_modules/express/node_modules/qs/support/should/examples/runner.js +0 -53
  175. data/server/node_modules/express/node_modules/qs/support/should/index.js +0 -2
  176. data/server/node_modules/express/node_modules/qs/support/should/lib/eql.js +0 -91
  177. data/server/node_modules/express/node_modules/qs/support/should/lib/should.js +0 -548
  178. data/server/node_modules/express/node_modules/qs/support/should/package.json +0 -8
  179. data/server/node_modules/express/node_modules/qs/support/should/test/should.test.js +0 -358
  180. data/server/node_modules/express/testing/views/users.jade +0 -1
  181. data/server/node_modules/node-uuid/test/benchmark.js +0 -27
@@ -1,80 +1,249 @@
1
+ // node-uuid/uuid.js
2
+ //
3
+ // Copyright (c) 2010 Robert Kieffer
4
+ // Dual licensed under the MIT and GPL licenses.
5
+ // Documentation and details at https://github.com/broofa/node-uuid
1
6
  (function() {
2
- /*
3
- * Generate a RFC4122(v4) UUID
4
- *
5
- * Documentation at https://github.com/broofa/node-uuid
6
- */
7
+ var _global = this;
7
8
 
8
- // Use node.js Buffer class if available, otherwise use the Array class
9
- var BufferClass = typeof(Buffer) == 'function' ? Buffer : Array;
9
+ // Unique ID creation requires a high quality random # generator, but
10
+ // Math.random() does not guarantee "cryptographic quality". So we feature
11
+ // detect for more robust APIs, normalizing each method to return 128-bits
12
+ // (16 bytes) of random data.
13
+ var mathRNG, nodeRNG, whatwgRNG;
14
+
15
+ // Math.random()-based RNG. All platforms, very fast, unknown quality
16
+ var _rndBytes = new Array(16);
17
+ mathRNG = function() {
18
+ var r, b = _rndBytes, i = 0;
19
+
20
+ for (var i = 0, r; i < 16; i++) {
21
+ if ((i & 0x03) == 0) r = Math.random() * 0x100000000;
22
+ b[i] = r >>> ((i & 0x03) << 3) & 0xff;
23
+ }
24
+
25
+ return b;
26
+ }
27
+
28
+ // WHATWG crypto-based RNG - http://wiki.whatwg.org/wiki/Crypto
29
+ // WebKit only (currently), moderately fast, high quality
30
+ if (_global.crypto && crypto.getRandomValues) {
31
+ var _rnds = new Uint32Array(4);
32
+ whatwgRNG = function() {
33
+ crypto.getRandomValues(_rnds);
10
34
 
11
- // Buffer used for generating string uuids
12
- var _buf = new BufferClass(16);
35
+ for (var c = 0 ; c < 16; c++) {
36
+ _rndBytes[c] = _rnds[c >> 2] >>> ((c & 0x03) * 8) & 0xff;
37
+ }
38
+ return _rndBytes;
39
+ }
40
+ }
41
+
42
+ // Node.js crypto-based RNG - http://nodejs.org/docs/v0.6.2/api/crypto.html
43
+ // Node.js only, moderately fast, high quality
44
+ try {
45
+ var _rb = require('crypto').randomBytes;
46
+ nodeRNG = _rb && function() {
47
+ return _rb(16);
48
+ };
49
+ } catch (e) {}
50
+
51
+ // Select RNG with best quality
52
+ var _rng = nodeRNG || whatwgRNG || mathRNG;
13
53
 
14
- // Cache number <-> hex string for octet values
15
- var toString = [];
16
- var toNumber = {};
54
+ // Buffer class to use
55
+ var BufferClass = typeof(Buffer) == 'function' ? Buffer : Array;
56
+
57
+ // Maps for number <-> hex string conversion
58
+ var _byteToHex = [];
59
+ var _hexToByte = {};
17
60
  for (var i = 0; i < 256; i++) {
18
- toString[i] = (i + 0x100).toString(16).substr(1);
19
- toNumber[toString[i]] = i;
61
+ _byteToHex[i] = (i + 0x100).toString(16).substr(1);
62
+ _hexToByte[_byteToHex[i]] = i;
20
63
  }
21
64
 
22
- function parse(s) {
23
- var buf = new BufferClass(16);
24
- var i = 0, ton = toNumber;
25
- s.toLowerCase().replace(/[0-9a-f][0-9a-f]/g, function(octet) {
26
- buf[i++] = toNumber[octet];
65
+ // **`parse()` - Parse a UUID into it's component bytes**
66
+ function parse(s, buf, offset) {
67
+ var i = (buf && offset) || 0, ii = 0;
68
+
69
+ buf = buf || [];
70
+ s.toLowerCase().replace(/[0-9a-f]{2}/g, function(byte) {
71
+ if (ii < 16) { // Don't overflow!
72
+ buf[i + ii++] = _hexToByte[byte];
73
+ }
27
74
  });
75
+
76
+ // Zero out remaining bytes if string was short
77
+ while (ii < 16) {
78
+ buf[i + ii++] = 0;
79
+ }
80
+
28
81
  return buf;
29
82
  }
30
83
 
31
- function unparse(buf) {
32
- var tos = toString, b = buf;
33
- return tos[b[0]] + tos[b[1]] + tos[b[2]] + tos[b[3]] + '-' +
34
- tos[b[4]] + tos[b[5]] + '-' +
35
- tos[b[6]] + tos[b[7]] + '-' +
36
- tos[b[8]] + tos[b[9]] + '-' +
37
- tos[b[10]] + tos[b[11]] + tos[b[12]] +
38
- tos[b[13]] + tos[b[14]] + tos[b[15]];
84
+ // **`unparse()` - Convert UUID byte array (ala parse()) into a string**
85
+ function unparse(buf, offset) {
86
+ var i = offset || 0, bth = _byteToHex;
87
+ return bth[buf[i++]] + bth[buf[i++]] +
88
+ bth[buf[i++]] + bth[buf[i++]] + '-' +
89
+ bth[buf[i++]] + bth[buf[i++]] + '-' +
90
+ bth[buf[i++]] + bth[buf[i++]] + '-' +
91
+ bth[buf[i++]] + bth[buf[i++]] + '-' +
92
+ bth[buf[i++]] + bth[buf[i++]] +
93
+ bth[buf[i++]] + bth[buf[i++]] +
94
+ bth[buf[i++]] + bth[buf[i++]];
39
95
  }
40
96
 
41
- var b32 = 0x100000000, ff = 0xff;
42
- function uuid(fmt, buf, offset) {
43
- var b = fmt != 'binary' ? _buf : (buf ? buf : new BufferClass(16));
97
+ // **`v1()` - Generate time-based UUID**
98
+ //
99
+ // Inspired by https://github.com/LiosK/UUID.js
100
+ // and http://docs.python.org/library/uuid.html
101
+
102
+ // random #'s we need to init node and clockseq
103
+ var _seedBytes = _rng();
104
+
105
+ // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
106
+ var _nodeId = [
107
+ _seedBytes[0] | 0x01,
108
+ _seedBytes[1], _seedBytes[2], _seedBytes[3], _seedBytes[4], _seedBytes[5]
109
+ ];
110
+
111
+ // Per 4.2.2, randomize (14 bit) clockseq
112
+ var _clockseq = (_seedBytes[6] << 8 | _seedBytes[7]) & 0x3fff;
113
+
114
+ // Previous uuid creation time
115
+ var _lastMSecs = 0, _lastNSecs = 0;
116
+
117
+ // See https://github.com/broofa/node-uuid for API details
118
+ function v1(options, buf, offset) {
44
119
  var i = buf && offset || 0;
120
+ var b = buf || [];
121
+
122
+ options = options || {};
123
+
124
+ var clockseq = options.clockseq != null ? options.clockseq : _clockseq;
125
+
126
+ // UUID timestamps are 100 nano-second units since the Gregorian epoch,
127
+ // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so
128
+ // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
129
+ // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.
130
+ var msecs = options.msecs != null ? options.msecs : new Date().getTime();
131
+
132
+ // Per 4.2.1.2, use count of uuid's generated during the current clock
133
+ // cycle to simulate higher resolution clock
134
+ var nsecs = options.nsecs != null ? options.nsecs : _lastNSecs + 1;
135
+
136
+ // Time since last uuid creation (in msecs)
137
+ var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000;
45
138
 
46
- var r = Math.random()*b32;
47
- b[i++] = r & ff;
48
- b[i++] = r>>>8 & ff;
49
- b[i++] = r>>>16 & ff;
50
- b[i++] = r>>>24 & ff;
51
- r = Math.random()*b32;
52
- b[i++] = r & ff;
53
- b[i++] = r>>>8 & ff;
54
- b[i++] = r>>>16 & 0x0f | 0x40; // See RFC4122 sect. 4.1.3
55
- b[i++] = r>>>24 & ff;
56
- r = Math.random()*b32;
57
- b[i++] = r & 0x3f | 0x80; // See RFC4122 sect. 4.4
58
- b[i++] = r>>>8 & ff;
59
- b[i++] = r>>>16 & ff;
60
- b[i++] = r>>>24 & ff;
61
- r = Math.random()*b32;
62
- b[i++] = r & ff;
63
- b[i++] = r>>>8 & ff;
64
- b[i++] = r>>>16 & ff;
65
- b[i++] = r>>>24 & ff;
66
-
67
- return fmt === undefined ? unparse(b) : b;
68
- };
139
+ // Per 4.2.1.2, Bump clockseq on clock regression
140
+ if (dt < 0 && options.clockseq == null) {
141
+ clockseq = clockseq + 1 & 0x3fff;
142
+ }
69
143
 
144
+ // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
145
+ // time interval
146
+ if ((dt < 0 || msecs > _lastMSecs) && options.nsecs == null) {
147
+ nsecs = 0;
148
+ }
149
+
150
+ // Per 4.2.1.2 Throw error if too many uuids are requested
151
+ if (nsecs >= 10000) {
152
+ throw new Error('uuid.v1(): Can\'t create more than 10M uuids/sec');
153
+ }
154
+
155
+ _lastMSecs = msecs;
156
+ _lastNSecs = nsecs;
157
+ _clockseq = clockseq;
158
+
159
+ // Per 4.1.4 - Convert from unix epoch to Gregorian epoch
160
+ msecs += 12219292800000;
161
+
162
+ // `time_low`
163
+ var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
164
+ b[i++] = tl >>> 24 & 0xff;
165
+ b[i++] = tl >>> 16 & 0xff;
166
+ b[i++] = tl >>> 8 & 0xff;
167
+ b[i++] = tl & 0xff;
168
+
169
+ // `time_mid`
170
+ var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff;
171
+ b[i++] = tmh >>> 8 & 0xff;
172
+ b[i++] = tmh & 0xff;
173
+
174
+ // `time_high_and_version`
175
+ b[i++] = tmh >>> 24 & 0xf | 0x10; // include version
176
+ b[i++] = tmh >>> 16 & 0xff;
177
+
178
+ // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)
179
+ b[i++] = clockseq >>> 8 | 0x80;
180
+
181
+ // `clock_seq_low`
182
+ b[i++] = clockseq & 0xff;
183
+
184
+ // `node`
185
+ var node = options.node || _nodeId;
186
+ for (var n = 0; n < 6; n++) {
187
+ b[i + n] = node[n];
188
+ }
189
+
190
+ return buf ? buf : unparse(b);
191
+ }
192
+
193
+ // **`v4()` - Generate random UUID**
194
+
195
+ // See https://github.com/broofa/node-uuid for API details
196
+ function v4(options, buf, offset) {
197
+ // Deprecated - 'format' argument, as supported in v1.2
198
+ var i = buf && offset || 0;
199
+
200
+ if (typeof(options) == 'string') {
201
+ buf = options == 'binary' ? new BufferClass(16) : null;
202
+ options = null;
203
+ }
204
+ options = options || {};
205
+
206
+ var rnds = options.random || (options.rng || _rng)();
207
+
208
+ // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
209
+ rnds[6] = (rnds[6] & 0x0f) | 0x40;
210
+ rnds[8] = (rnds[8] & 0x3f) | 0x80;
211
+
212
+ // Copy bytes to buffer, if provided
213
+ if (buf) {
214
+ for (var ii = 0; ii < 16; ii++) {
215
+ buf[i + ii] = rnds[ii];
216
+ }
217
+ }
218
+
219
+ return buf || unparse(rnds);
220
+ }
221
+
222
+ // Export public API
223
+ var uuid = v4;
224
+ uuid.v1 = v1;
225
+ uuid.v4 = v4;
70
226
  uuid.parse = parse;
71
227
  uuid.unparse = unparse;
72
228
  uuid.BufferClass = BufferClass;
73
229
 
230
+ // Export RNG options
231
+ uuid.mathRNG = mathRNG;
232
+ uuid.nodeRNG = nodeRNG;
233
+ uuid.whatwgRNG = whatwgRNG;
234
+
74
235
  if (typeof(module) != 'undefined') {
236
+ // Play nice with node.js
75
237
  module.exports = uuid;
76
238
  } else {
77
- // In browser? Set as top-level function
78
- this.uuid = uuid;
239
+ // Play nice with browsers
240
+ var _previousRoot = _global.uuid;
241
+
242
+ // **`noConflict()` - (browser only) to reset global 'uuid' var**
243
+ uuid.noConflict = function() {
244
+ _global.uuid = _previousRoot;
245
+ return uuid;
246
+ }
247
+ _global.uuid = uuid;
79
248
  }
80
- })();
249
+ }());
@@ -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) {