Skip to content

Commit

Permalink
Change array to object with cookies and query
Browse files Browse the repository at this point in the history
  • Loading branch information
mrdaano committed Aug 13, 2020
1 parent ce9fa26 commit 50f1d7d
Show file tree
Hide file tree
Showing 6 changed files with 135 additions and 27 deletions.
5 changes: 5 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
"mocha": "^7.1.1"
},
"dependencies": {
"cookie": "^0.4.1",
"query-string": "^6.13.1"
}
}
11 changes: 11 additions & 0 deletions src/helpers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
const cookie = require('cookie');

function parseCookieHeader (header) {
return (Array.isArray(header) ? header : header.split(',')).map(
xs => cookie.parse(xs)
).reduce((lhs, rhs) => Object.assign(lhs, rhs), {});
}

module.exports = {
parseCookieHeader
}
6 changes: 3 additions & 3 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ const http = require('http');
const https = require('https')
const qs = require('query-string')
const RedirectLimitError = require('./errors/RedirectLimitError');
const helpers = require('./helpers');

/**
* Follows all 300x errors
Expand Down Expand Up @@ -53,12 +54,11 @@ function followRedirects(url, opts = {}) {
request.on('response', (res) => {
let { location } = res.headers;
const queryParamsObj = qs.parse(new URL(urlToGo.toString()).search)
const queryParamsArr = Object.keys(queryParamsObj).map((k) => ({ key: k, value: queryParamsObj[k] }))
redirectChain.push({
url: urlToGo.toString(),
code: res.statusCode,
cookies: res.headers['set-cookie'] || [],
queryParams: queryParamsArr || []
cookies: res.headers['set-cookie'] ? helpers.parseCookieHeader(res.headers['set-cookie']) : {},
queryParams: queryParamsObj
});

if (location && isRedirect(res.statusCode)) {
Expand Down
6 changes: 6 additions & 0 deletions test/mockServer.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,12 @@ class MockServer {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('world');
}

if (path === '/cookie') {
res.statusCode = 200;
res.setHeader('Set-Cookie', 'hello=world');
res.end();
}

if (path === '/redirect/301') {
Expand Down
133 changes: 109 additions & 24 deletions test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,9 @@ describe('follow-url-redirects', () => {
const expected = [
{
url: url,
code: 200
code: 200,
cookies: {},
queryParams: {}
}
];

Expand All @@ -59,11 +61,15 @@ describe('follow-url-redirects', () => {
const expected = [
{
url: url,
code: 301
code: 301,
cookies: {},
queryParams: {}
},
{
url: `${baseUrl}hello`,
code: 200
code: 200,
cookies: {},
queryParams: {}
}
];

Expand All @@ -75,11 +81,15 @@ describe('follow-url-redirects', () => {
const expected = [
{
url: url,
code: 302
code: 302,
cookies: {},
queryParams: {}
},
{
url: `${baseUrl}hello`,
code: 200
code: 200,
cookies: {},
queryParams: {}
}
];

Expand All @@ -91,11 +101,15 @@ describe('follow-url-redirects', () => {
const expected = [
{
url: url,
code: 303
code: 303,
cookies: {},
queryParams: {}
},
{
url: `${baseUrl}hello`,
code: 200
code: 200,
cookies: {},
queryParams: {}
}
];

Expand All @@ -107,11 +121,15 @@ describe('follow-url-redirects', () => {
const expected = [
{
url: url,
code: 307
code: 307,
cookies: {},
queryParams: {}
},
{
url: `${baseUrl}hello`,
code: 200
code: 200,
cookies: {},
queryParams: {}
}
];

Expand All @@ -123,11 +141,15 @@ describe('follow-url-redirects', () => {
const expected = [
{
url: url,
code: 308
code: 308,
cookies: {},
queryParams: {}
},
{
url: `${baseUrl}hello`,
code: 200
code: 200,
cookies: {},
queryParams: {}
}
];

Expand All @@ -139,15 +161,21 @@ describe('follow-url-redirects', () => {
const expected = [
{
url: url,
code: 301
code: 301,
cookies: {},
queryParams: {}
},
{
url: `${baseUrl}redirect/301`,
code: 301
code: 301,
cookies: {},
queryParams: {}
},
{
url: `${baseUrl}hello`,
code: 200
code: 200,
cookies: {},
queryParams: {}
}
];

Expand All @@ -159,15 +187,21 @@ describe('follow-url-redirects', () => {
const expected = [
{
url: url,
code: 301
code: 301,
cookies: {},
queryParams: {}
},
{
url: `${baseUrl}redirect/301`,
code: 301
code: 301,
cookies: {},
queryParams: {}
},
{
url: `${baseUrl}hello`,
code: 200
code: 200,
cookies: {},
queryParams: {}
}
];

Expand All @@ -179,19 +213,27 @@ describe('follow-url-redirects', () => {
const expected = [
{
url: url,
code: 301
code: 301,
cookies: {},
queryParams: {}
},
{
url: `${baseUrl}redirect/slow`,
code: 301
code: 301,
cookies: {},
queryParams: {}
},
{
url: `${baseUrl}redirect/301`,
code: 301
code: 301,
cookies: {},
queryParams: {}
},
{
url: `${baseUrl}hello`,
code: 200
code: 200,
cookies: {},
queryParams: {}
}
];

Expand All @@ -203,7 +245,9 @@ describe('follow-url-redirects', () => {
const expected = [
{
url: url,
code: 301
code: 301,
cookies: {},
queryParams: {}
}
];

Expand Down Expand Up @@ -232,11 +276,15 @@ describe('follow-url-redirects', () => {
const redirects = [
{
url,
code: 301
code: 301,
cookies: {},
queryParams: {}
},
{
url: `${baseUrl}redirect/301`,
code: 301
code: 301,
cookies: {},
queryParams: {}
}
];

Expand All @@ -248,4 +296,41 @@ describe('follow-url-redirects', () => {
expect(error.redirects).to.be.eql(redirects);
}
});

it('Returns the cookies of a request', async () => {
const url = `${baseUrl}cookie`;
const expected = [
{
url: url,
code: 200,
cookies:
{
hello: 'world'
},
queryParams: {}
}
];

expect((await followRedirects(url))).to.be.eql(expected);
});

it('Returns the cookies and query params of a request', async () => {
const url = `${baseUrl}cookie?hello=world&test=1`;
const expected = [
{
url: url,
code: 200,
cookies:
{
hello: 'world'
},
queryParams: {
hello: 'world',
test: '1'
}
}
];

expect((await followRedirects(url))).to.be.eql(expected);
});
});

0 comments on commit 50f1d7d

Please sign in to comment.