PageRenderTime 40ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/node_modules/needle/test/cookies_spec.js

https://gitlab.com/varunsonavne/node-hello
JavaScript | 305 lines | 295 code | 10 blank | 0 comment | 0 complexity | d675db55757094009137c91406df1f7c MD5 | raw file
  1. var needle = require('../'),
  2. cookies = require('../lib/cookies'),
  3. sinon = require('sinon'),
  4. http = require('http'),
  5. should = require('should'),
  6. assert = require('assert');
  7. var WEIRD_COOKIE_NAME = 'wc',
  8. BASE64_COOKIE_NAME = 'bc',
  9. FORBIDDEN_COOKIE_NAME = 'fc',
  10. NUMBER_COOKIE_NAME = 'nc';
  11. var WEIRD_COOKIE_VALUE = '!\'*+#()&-./0123456789:<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~',
  12. BASE64_COOKIE_VALUE = 'Y29va2llCg==',
  13. FORBIDDEN_COOKIE_VALUE = ' ;"\\,',
  14. NUMBER_COOKIE_VALUE = 12354342;
  15. var TEST_HOST = 'localhost',
  16. NO_COOKIES_TEST_PORT = 11112,
  17. ALL_COOKIES_TEST_PORT = 11113;
  18. describe('cookies', function() {
  19. var setCookieHeader, headers, server, opts;
  20. function decode(str) {
  21. return decodeURIComponent(str);
  22. }
  23. function encode(str) {
  24. str = str.toString().replace(/[\x00-\x1F\x7F]/g, encodeURIComponent);
  25. return str.replace(/[\s\"\,;\\%]/g, encodeURIComponent);
  26. }
  27. before(function() {
  28. setCookieHeader = [
  29. WEIRD_COOKIE_NAME + '=' + encode(WEIRD_COOKIE_VALUE) + ';',
  30. BASE64_COOKIE_NAME + '=' + encode(BASE64_COOKIE_VALUE) + ';',
  31. FORBIDDEN_COOKIE_NAME + '=' + encode(FORBIDDEN_COOKIE_VALUE) + ';',
  32. NUMBER_COOKIE_NAME + '=' + encode(NUMBER_COOKIE_VALUE) + ';'
  33. ];
  34. });
  35. before(function(done) {
  36. serverAllCookies = http.createServer(function(req, res) {
  37. res.setHeader('Content-Type', 'text/html');
  38. res.setHeader('Set-Cookie', setCookieHeader);
  39. res.end('200');
  40. }).listen(ALL_COOKIES_TEST_PORT, TEST_HOST, done);
  41. });
  42. after(function(done) {
  43. serverAllCookies.close(done);
  44. });
  45. describe('with default options', function() {
  46. it('no cookie header is set on request', function(done) {
  47. needle.get(
  48. TEST_HOST + ':' + ALL_COOKIES_TEST_PORT, function(err, response) {
  49. assert(!response.req._headers.cookie);
  50. done();
  51. });
  52. });
  53. });
  54. describe('if response does not contain cookies', function() {
  55. before(function(done) {
  56. serverNoCookies = http.createServer(function(req, res) {
  57. res.setHeader('Content-Type', 'text/html');
  58. res.end('200');
  59. }).listen(NO_COOKIES_TEST_PORT, TEST_HOST, done);
  60. });
  61. it('response.cookies is undefined', function(done) {
  62. needle.get(
  63. TEST_HOST + ':' + NO_COOKIES_TEST_PORT, function(error, response) {
  64. assert(!response.cookies);
  65. done();
  66. });
  67. });
  68. after(function(done) {
  69. serverNoCookies.close(done);
  70. });
  71. });
  72. describe('if response contains cookies', function() {
  73. it('puts them on resp.cookies', function(done) {
  74. needle.get(
  75. TEST_HOST + ':' + ALL_COOKIES_TEST_PORT, function(error, response) {
  76. response.should.have.property('cookies');
  77. done();
  78. });
  79. });
  80. it('parses them as a object', function(done) {
  81. needle.get(
  82. TEST_HOST + ':' + ALL_COOKIES_TEST_PORT, function(error, response) {
  83. response.cookies.should.be.an.instanceOf(Object)
  84. .and.have.property(WEIRD_COOKIE_NAME);
  85. response.cookies.should.have.property(BASE64_COOKIE_NAME);
  86. response.cookies.should.have.property(FORBIDDEN_COOKIE_NAME);
  87. response.cookies.should.have.property(NUMBER_COOKIE_NAME);
  88. done();
  89. });
  90. });
  91. it('must decode it', function(done) {
  92. needle.get(
  93. TEST_HOST + ':' + ALL_COOKIES_TEST_PORT, function(error, response) {
  94. response.cookies.wc.should.be.eql(WEIRD_COOKIE_VALUE);
  95. response.cookies.bc.should.be.eql(BASE64_COOKIE_VALUE);
  96. response.cookies.fc.should.be.eql(FORBIDDEN_COOKIE_VALUE);
  97. response.cookies.nc.should.be.eql(NUMBER_COOKIE_VALUE.toString());
  98. done();
  99. });
  100. });
  101. describe('when a cookie value is invalid', function() {
  102. before(function() {
  103. setCookieHeader = [
  104. 'geo_city=%D1%E0%ED%EA%F2-%CF%E5%F2%E5%F0%E1%F3%F0%E3'
  105. ];
  106. })
  107. it('doesnt blow up', function(done) {
  108. needle.get(TEST_HOST + ':' + ALL_COOKIES_TEST_PORT, function(error, response) {
  109. should.not.exist(error)
  110. var whatever = 'efbfbdefbfbdefbfbdefbfbdefbfbd2defbfbdefbfbdefbfbdefbfbdefbfbdefbfbdefbfbdefbfbdefbfbd';
  111. Buffer.from(response.cookies.geo_city).toString('hex').should.eql(whatever)
  112. done();
  113. });
  114. })
  115. })
  116. describe('and response is a redirect', function() {
  117. var redirectServer, testPort = 22222;
  118. var responseCookies = [
  119. [ // first req
  120. WEIRD_COOKIE_NAME + '=' + encode(WEIRD_COOKIE_VALUE) + ';',
  121. BASE64_COOKIE_NAME + '=' + encode(BASE64_COOKIE_VALUE) + ';',
  122. 'FOO=123;'
  123. ], [ // second req
  124. FORBIDDEN_COOKIE_NAME + '=' + encode(FORBIDDEN_COOKIE_VALUE) + ';',
  125. NUMBER_COOKIE_NAME + '=' + encode(NUMBER_COOKIE_VALUE) + ';'
  126. ], [ // third red
  127. 'FOO=BAR;'
  128. ]
  129. ]
  130. before(function() {
  131. redirectServer = http.createServer(function(req, res) {
  132. var number = parseInt(req.url.replace('/', ''));
  133. var nextUrl = 'http://' + TEST_HOST + ':' + testPort + '/' + (number + 1);
  134. if (responseCookies[number]) { // got cookies
  135. res.statusCode = 302;
  136. res.setHeader('Set-Cookie', responseCookies[number]);
  137. res.setHeader('Location', nextUrl);
  138. } else if (number == 3) {
  139. res.statusCode = 302; // redirect but without cookies
  140. res.setHeader('Location', nextUrl);
  141. }
  142. res.end('OK');
  143. }).listen(22222, TEST_HOST);
  144. });
  145. after(function(done) {
  146. redirectServer.close(done);
  147. })
  148. describe('and follow_set_cookies is false', function() {
  149. var opts = {
  150. follow_set_cookies: false,
  151. follow_max: 4
  152. };
  153. it('no cookie header set on redirection request', function(done) {
  154. var spy = sinon.spy(cookies, 'write');
  155. needle.get(TEST_HOST + ':' + testPort + '/0', opts, function(err, resp) {
  156. spy.callCount.should.eql(0);
  157. done();
  158. });
  159. });
  160. });
  161. describe('and follow_set_cookies is true', function() {
  162. var opts = {
  163. follow_set_cookies: true,
  164. follow_max: 4
  165. };
  166. it('should have all the cookies', function(done) {
  167. needle.get(TEST_HOST + ':' + testPort + '/0', opts, function(err, resp) {
  168. resp.cookies.should.have.property(WEIRD_COOKIE_NAME);
  169. resp.cookies.should.have.property(BASE64_COOKIE_NAME);
  170. resp.cookies.should.have.property(FORBIDDEN_COOKIE_NAME);
  171. resp.cookies.should.have.property(NUMBER_COOKIE_NAME);
  172. resp.cookies.should.have.property('FOO');
  173. resp.cookies.FOO.should.eql('BAR'); // should overwrite previous one
  174. done();
  175. });
  176. });
  177. });
  178. });
  179. describe('with parse_cookies = false', function() {
  180. it('does not parse them', function(done) {
  181. needle.get(
  182. TEST_HOST + ':' + ALL_COOKIES_TEST_PORT, { parse_cookies: false }, function(error, response) {
  183. assert(!response.cookies);
  184. done();
  185. });
  186. });
  187. });
  188. });
  189. describe('if request contains cookie header', function() {
  190. var opts = {
  191. cookies: {}
  192. };
  193. before(function() {
  194. opts.cookies[WEIRD_COOKIE_NAME] = WEIRD_COOKIE_VALUE;
  195. opts.cookies[BASE64_COOKIE_NAME] = BASE64_COOKIE_VALUE;
  196. opts.cookies[FORBIDDEN_COOKIE_NAME] = FORBIDDEN_COOKIE_VALUE;
  197. opts.cookies[NUMBER_COOKIE_NAME] = NUMBER_COOKIE_VALUE;
  198. });
  199. it('must be a valid cookie string', function(done) {
  200. var COOKIE_PAIR = /^([^=\s]+)\s*=\s*("?)\s*(.*)\s*\2\s*$/;
  201. var full_header = [
  202. WEIRD_COOKIE_NAME + '=' + WEIRD_COOKIE_VALUE,
  203. BASE64_COOKIE_NAME + '=' + BASE64_COOKIE_VALUE,
  204. FORBIDDEN_COOKIE_NAME + '=' + encode(FORBIDDEN_COOKIE_VALUE),
  205. NUMBER_COOKIE_NAME + '=' + NUMBER_COOKIE_VALUE
  206. ].join('; ')
  207. needle.get(TEST_HOST + ':' + ALL_COOKIES_TEST_PORT, opts, function(error, response) {
  208. var cookieString = response.req._headers.cookie;
  209. cookieString.should.be.type('string');
  210. cookieString.split(/\s*;\s*/).forEach(function(pair) {
  211. COOKIE_PAIR.test(pair).should.be.exactly(true);
  212. });
  213. cookieString.should.be.exactly(full_header);
  214. done();
  215. });
  216. });
  217. it('dont have to encode allowed characters', function(done) {
  218. var COOKIE_PAIR = /^([^=\s]+)\s*=\s*("?)\s*(.*)\s*\2\s*$/,
  219. KEY_INDEX = 1,
  220. VALUE_INEX = 3;
  221. needle.get(TEST_HOST + ':' + ALL_COOKIES_TEST_PORT, opts, function(error, response) {
  222. var cookieObj = {},
  223. cookieString = response.req._headers.cookie;
  224. cookieString.split(/\s*;\s*/).forEach(function(str) {
  225. var pair = COOKIE_PAIR.exec(str);
  226. cookieObj[pair[KEY_INDEX]] = pair[VALUE_INEX];
  227. });
  228. cookieObj[WEIRD_COOKIE_NAME].should.be.exactly(WEIRD_COOKIE_VALUE);
  229. cookieObj[BASE64_COOKIE_NAME].should.be.exactly(BASE64_COOKIE_VALUE);
  230. done();
  231. });
  232. });
  233. it('must encode forbidden characters', function(done) {
  234. var COOKIE_PAIR = /^([^=\s]+)\s*=\s*("?)\s*(.*)\s*\2\s*$/,
  235. KEY_INDEX = 1,
  236. VALUE_INEX = 3;
  237. needle.get(TEST_HOST + ':' + ALL_COOKIES_TEST_PORT, opts, function(error, response) {
  238. var cookieObj = {},
  239. cookieString = response.req._headers.cookie;
  240. cookieString.split(/\s*;\s*/).forEach(function(str) {
  241. var pair = COOKIE_PAIR.exec(str);
  242. cookieObj[pair[KEY_INDEX]] = pair[VALUE_INEX];
  243. });
  244. cookieObj[FORBIDDEN_COOKIE_NAME].should.not.be.eql(
  245. FORBIDDEN_COOKIE_VALUE);
  246. cookieObj[FORBIDDEN_COOKIE_NAME].should.be.exactly(
  247. encode(FORBIDDEN_COOKIE_VALUE));
  248. cookieObj[FORBIDDEN_COOKIE_NAME].should.be.exactly(
  249. encodeURIComponent(FORBIDDEN_COOKIE_VALUE));
  250. done();
  251. });
  252. });
  253. });
  254. });