Ein Projekt das es ermöglicht Beerpong über das Internet von zwei unabhängigen positionen aus zu spielen. Entstehung im Rahmen einer Praktikumsaufgabe im Fach Interaktion.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

parse.js 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. // Load modules
  2. var Lab = require('lab');
  3. var Qs = require('../');
  4. // Declare internals
  5. var internals = {};
  6. // Test shortcuts
  7. var lab = exports.lab = Lab.script();
  8. var expect = Lab.expect;
  9. var before = lab.before;
  10. var after = lab.after;
  11. var describe = lab.experiment;
  12. var it = lab.test;
  13. describe('#parse', function () {
  14. it('parses a simple string', function (done) {
  15. expect(Qs.parse('0=foo')).to.deep.equal({ '0': 'foo' });
  16. expect(Qs.parse('foo=c++')).to.deep.equal({ foo: 'c ' });
  17. expect(Qs.parse('a[>=]=23')).to.deep.equal({ a: { '>=': '23' } });
  18. expect(Qs.parse('a[<=>]==23')).to.deep.equal({ a: { '<=>': '=23' } });
  19. expect(Qs.parse('a[==]=23')).to.deep.equal({ a: { '==': '23' } });
  20. expect(Qs.parse('foo')).to.deep.equal({ foo: '' });
  21. expect(Qs.parse('foo=bar')).to.deep.equal({ foo: 'bar' });
  22. expect(Qs.parse(' foo = bar = baz ')).to.deep.equal({ ' foo ': ' bar = baz ' });
  23. expect(Qs.parse('foo=bar=baz')).to.deep.equal({ foo: 'bar=baz' });
  24. expect(Qs.parse('foo=bar&bar=baz')).to.deep.equal({ foo: 'bar', bar: 'baz' });
  25. expect(Qs.parse('foo=bar&baz')).to.deep.equal({ foo: 'bar', baz: '' });
  26. expect(Qs.parse('cht=p3&chd=t:60,40&chs=250x100&chl=Hello|World')).to.deep.equal({
  27. cht: 'p3',
  28. chd: 't:60,40',
  29. chs: '250x100',
  30. chl: 'Hello|World'
  31. });
  32. done();
  33. });
  34. it('parses a single nested string', function (done) {
  35. expect(Qs.parse('a[b]=c')).to.deep.equal({ a: { b: 'c' } });
  36. done();
  37. });
  38. it('parses a double nested string', function (done) {
  39. expect(Qs.parse('a[b][c]=d')).to.deep.equal({ a: { b: { c: 'd' } } });
  40. done();
  41. });
  42. it('defaults to a depth of 5', function (done) {
  43. expect(Qs.parse('a[b][c][d][e][f][g][h]=i')).to.deep.equal({ a: { b: { c: { d: { e: { f: { '[g][h]': 'i' } } } } } } });
  44. done();
  45. });
  46. it('only parses one level when depth = 1', function (done) {
  47. expect(Qs.parse('a[b][c]=d', { depth: 1 })).to.deep.equal({ a: { b: { '[c]': 'd' } } });
  48. expect(Qs.parse('a[b][c][d]=e', { depth: 1 })).to.deep.equal({ a: { b: { '[c][d]': 'e' } } });
  49. done();
  50. });
  51. it('parses a simple array', function (done) {
  52. expect(Qs.parse('a=b&a=c')).to.deep.equal({ a: ['b', 'c'] });
  53. done();
  54. });
  55. it('parses an explicit array', function (done) {
  56. expect(Qs.parse('a[]=b')).to.deep.equal({ a: ['b'] });
  57. expect(Qs.parse('a[]=b&a[]=c')).to.deep.equal({ a: ['b', 'c'] });
  58. expect(Qs.parse('a[]=b&a[]=c&a[]=d')).to.deep.equal({ a: ['b', 'c', 'd'] });
  59. done();
  60. });
  61. it('parses a nested array', function (done) {
  62. expect(Qs.parse('a[b][]=c&a[b][]=d')).to.deep.equal({ a: { b: ['c', 'd'] } });
  63. expect(Qs.parse('a[>=]=25')).to.deep.equal({ a: { '>=': '25' } });
  64. done();
  65. });
  66. it('allows to specify array indices', function (done) {
  67. expect(Qs.parse('a[1]=c&a[0]=b&a[2]=d')).to.deep.equal({ a: ['b', 'c', 'd'] });
  68. expect(Qs.parse('a[1]=c&a[0]=b')).to.deep.equal({ a: ['b', 'c'] });
  69. expect(Qs.parse('a[1]=c')).to.deep.equal({ a: ['c'] });
  70. done();
  71. });
  72. it('limits specific array indices to 20', function (done) {
  73. expect(Qs.parse('a[20]=a')).to.deep.equal({ a: ['a'] });
  74. expect(Qs.parse('a[21]=a')).to.deep.equal({ a: { '21': 'a' } });
  75. done();
  76. });
  77. it('supports keys that begin with a number', function (done) {
  78. expect(Qs.parse('a[12b]=c')).to.deep.equal({ a: { '12b': 'c' } });
  79. done();
  80. });
  81. it('supports encoded = signs', function (done) {
  82. expect(Qs.parse('he%3Dllo=th%3Dere')).to.deep.equal({ 'he=llo': 'th=ere' });
  83. done();
  84. });
  85. it('is ok with url encoded strings', function (done) {
  86. expect(Qs.parse('a[b%20c]=d')).to.deep.equal({ a: { 'b c': 'd' } });
  87. expect(Qs.parse('a[b]=c%20d')).to.deep.equal({ a: { b: 'c d' } });
  88. done();
  89. });
  90. it('allows brackets in the value', function (done) {
  91. expect(Qs.parse('pets=["tobi"]')).to.deep.equal({ pets: '["tobi"]' });
  92. expect(Qs.parse('operators=[">=", "<="]')).to.deep.equal({ operators: '[">=", "<="]' });
  93. done();
  94. });
  95. it('allows empty values', function (done) {
  96. expect(Qs.parse('')).to.deep.equal({});
  97. expect(Qs.parse(null)).to.deep.equal({});
  98. expect(Qs.parse(undefined)).to.deep.equal({});
  99. done();
  100. });
  101. it('transforms arrays to objects', function (done) {
  102. expect(Qs.parse('foo[0]=bar&foo[bad]=baz')).to.deep.equal({ foo: { '0': 'bar', bad: 'baz' } });
  103. expect(Qs.parse('foo[bad]=baz&foo[0]=bar')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar' } });
  104. expect(Qs.parse('foo[bad]=baz&foo[]=bar')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar' } });
  105. expect(Qs.parse('foo[]=bar&foo[bad]=baz')).to.deep.equal({ foo: { '0': 'bar', bad: 'baz' } });
  106. expect(Qs.parse('foo[bad]=baz&foo[]=bar&foo[]=foo')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar', '1': 'foo' } });
  107. expect(Qs.parse('foo[0][a]=a&foo[0][b]=b&foo[1][a]=aa&foo[1][b]=bb')).to.deep.equal({foo: [ {a: 'a', b: 'b'}, {a: 'aa', b: 'bb'} ]});
  108. done();
  109. });
  110. it('correctly prunes undefined values when converting an array to an object', function (done) {
  111. expect(Qs.parse('a[2]=b&a[99999999]=c')).to.deep.equal({ a: { '2': 'b', '99999999': 'c' } });
  112. done();
  113. });
  114. it('supports malformed uri characters', function (done) {
  115. expect(Qs.parse('{%:%}')).to.deep.equal({ '{%:%}': '' });
  116. expect(Qs.parse('foo=%:%}')).to.deep.equal({ foo: '%:%}' });
  117. done();
  118. });
  119. it('doesn\'t produce empty keys', function (done) {
  120. expect(Qs.parse('_r=1&')).to.deep.equal({ '_r': '1' });
  121. done();
  122. });
  123. it('cannot override prototypes', function (done) {
  124. var obj = Qs.parse('toString=bad&bad[toString]=bad&constructor=bad');
  125. expect(typeof obj.toString).to.equal('function');
  126. expect(typeof obj.bad.toString).to.equal('function');
  127. expect(typeof obj.constructor).to.equal('function');
  128. done();
  129. });
  130. it('cannot access Object prototype', function (done) {
  131. Qs.parse('constructor[prototype][bad]=bad');
  132. Qs.parse('bad[constructor][prototype][bad]=bad');
  133. expect(typeof Object.prototype.bad).to.equal('undefined');
  134. done();
  135. });
  136. it('parses arrays of objects', function (done) {
  137. expect(Qs.parse('a[][b]=c')).to.deep.equal({ a: [{ b: 'c' }] });
  138. expect(Qs.parse('a[0][b]=c')).to.deep.equal({ a: [{ b: 'c' }] });
  139. done();
  140. });
  141. it('allows for empty strings in arrays', function (done) {
  142. expect(Qs.parse('a[]=b&a[]=&a[]=c')).to.deep.equal({ a: ['b', '', 'c'] });
  143. expect(Qs.parse('a[0]=b&a[1]=&a[2]=c&a[19]=')).to.deep.equal({ a: ['b', '', 'c', ''] });
  144. expect(Qs.parse('a[]=&a[]=b&a[]=c')).to.deep.equal({ a: ['', 'b', 'c'] });
  145. done();
  146. });
  147. it('compacts sparse arrays', function (done) {
  148. expect(Qs.parse('a[10]=1&a[2]=2')).to.deep.equal({ a: ['2', '1'] });
  149. done();
  150. });
  151. it('parses semi-parsed strings', function (done) {
  152. expect(Qs.parse({ 'a[b]': 'c' })).to.deep.equal({ a: { b: 'c' } });
  153. expect(Qs.parse({ 'a[b]': 'c', 'a[d]': 'e' })).to.deep.equal({ a: { b: 'c', d: 'e' } });
  154. done();
  155. });
  156. it('parses buffers correctly', function (done) {
  157. var b = new Buffer('test');
  158. expect(Qs.parse({ a: b })).to.deep.equal({ a: b });
  159. done();
  160. });
  161. it('continues parsing when no parent is found', function (done) {
  162. expect(Qs.parse('[]&a=b')).to.deep.equal({ '0': '', a: 'b' });
  163. expect(Qs.parse('[foo]=bar')).to.deep.equal({ foo: 'bar' });
  164. done();
  165. });
  166. it('does not error when parsing a very long array', function (done) {
  167. var str = 'a[]=a';
  168. while (Buffer.byteLength(str) < 128 * 1024) {
  169. str += '&' + str;
  170. }
  171. expect(function () {
  172. Qs.parse(str);
  173. }).to.not.throw();
  174. done();
  175. });
  176. it('should not throw when a native prototype has an enumerable property', { parallel: false }, function (done) {
  177. Object.prototype.crash = '';
  178. Array.prototype.crash = '';
  179. expect(Qs.parse.bind(null, 'a=b')).to.not.throw();
  180. expect(Qs.parse('a=b')).to.deep.equal({ a: 'b' });
  181. expect(Qs.parse.bind(null, 'a[][b]=c')).to.not.throw();
  182. expect(Qs.parse('a[][b]=c')).to.deep.equal({ a: [{ b: 'c' }] });
  183. delete Object.prototype.crash;
  184. delete Array.prototype.crash;
  185. done();
  186. });
  187. it('parses a string with an alternative string delimiter', function (done) {
  188. expect(Qs.parse('a=b;c=d', { delimiter: ';' })).to.deep.equal({ a: 'b', c: 'd' });
  189. done();
  190. });
  191. it('parses a string with an alternative RegExp delimiter', function (done) {
  192. expect(Qs.parse('a=b; c=d', { delimiter: /[;,] */ })).to.deep.equal({ a: 'b', c: 'd' });
  193. done();
  194. });
  195. it('does not use non-splittable objects as delimiters', function (done) {
  196. expect(Qs.parse('a=b&c=d', { delimiter: true })).to.deep.equal({ a: 'b', c: 'd' });
  197. done();
  198. });
  199. it('allows overriding parameter limit', function (done) {
  200. expect(Qs.parse('a=b&c=d', { parameterLimit: 1 })).to.deep.equal({ a: 'b' });
  201. done();
  202. });
  203. it('allows setting the parameter limit to Infinity', function (done) {
  204. expect(Qs.parse('a=b&c=d', { parameterLimit: Infinity })).to.deep.equal({ a: 'b', c: 'd' });
  205. done();
  206. });
  207. it('allows overriding array limit', function (done) {
  208. expect(Qs.parse('a[0]=b&a[1]=c', { arrayLimit: 0 })).to.deep.equal({ a: { '0': 'b', '1': 'c' } });
  209. done();
  210. });
  211. it('parses an object', function (done) {
  212. var input = {
  213. "user[name]": {"pop[bob]": 3},
  214. "user[email]": null
  215. };
  216. var expected = {
  217. "user": {
  218. "name": {"pop[bob]": 3},
  219. "email": null
  220. }
  221. };
  222. var result = Qs.parse(input);
  223. expect(result).to.deep.equal(expected);
  224. done();
  225. });
  226. it('parses an object and not child values', function (done) {
  227. var input = {
  228. "user[name]": {"pop[bob]": { "test": 3 }},
  229. "user[email]": null
  230. };
  231. var expected = {
  232. "user": {
  233. "name": {"pop[bob]": { "test": 3 }},
  234. "email": null
  235. }
  236. };
  237. var result = Qs.parse(input);
  238. expect(result).to.deep.equal(expected);
  239. done();
  240. });
  241. it('does not blow up when Buffer global is missing', function (done) {
  242. var tempBuffer = global.Buffer;
  243. delete global.Buffer;
  244. expect(Qs.parse('a=b&c=d')).to.deep.equal({ a: 'b', c: 'd' });
  245. global.Buffer = tempBuffer;
  246. done();
  247. });
  248. it('does not crash when using invalid dot notation', function (done) {
  249. expect(Qs.parse('roomInfoList[0].childrenAges[0]=15&roomInfoList[0].numberOfAdults=2')).to.deep.equal({ roomInfoList: [['15', '2']] });
  250. done();
  251. });
  252. it('does not crash when parsing circular references', function (done) {
  253. var a = {};
  254. a.b = a;
  255. var parsed;
  256. expect(function () {
  257. parsed = Qs.parse({ 'foo[bar]': 'baz', 'foo[baz]': a });
  258. }).to.not.throw(Error);
  259. expect(parsed).to.have.key('foo');
  260. expect(parsed.foo).to.have.keys('bar', 'baz');
  261. expect(parsed.foo.bar).to.equal('baz');
  262. expect(parsed.foo.baz).to.deep.equal(a);
  263. done();
  264. });
  265. it('parses plain objects correctly', function (done) {
  266. var a = Object.create(null);
  267. a.b = 'c';
  268. expect(Qs.parse(a)).to.deep.equal({ b: 'c' });
  269. expect(Qs.parse({ a: a })).to.deep.equal({ a: { b: 'c' } });
  270. done();
  271. });
  272. it('parses dates correctly', function (done) {
  273. var now = new Date();
  274. expect(Qs.parse({ a: now })).to.deep.equal({ a: now });
  275. done();
  276. });
  277. it('parses regular expressions correctly', function (done) {
  278. var re = /^test$/;
  279. expect(Qs.parse({ a: re })).to.deep.equal({ a: re });
  280. done();
  281. });
  282. });