diff --git a/app/backend/__tests__/har.test.js b/app/backend/__tests__/har.test.js new file mode 100644 index 0000000000..b84e6da21b --- /dev/null +++ b/app/backend/__tests__/har.test.js @@ -0,0 +1,69 @@ +import * as harUtils from '../export/har'; +import * as db from '../database'; +import * as render from '../render'; + +describe('exportHarWithRequest()', () => { + beforeEach(() => db.initDB({inMemoryOnly: true}, true)); + it('renders does it correctly', async () => { + const workspace = await db.workspace.create(); + const cookies = [{ + creation: new Date('2016-10-05T04:40:49.505Z'), + key: 'foo', + value: 'barrrrr', + expires: new Date('2096-10-12T04:40:49.000Z'), + domain: 'google.com', + path: '/', + hostOnly: true, + lastAccessed: new Date('2096-10-05T04:40:49.505Z') + }]; + + await db.cookieJar.create({ + parentId: workspace._id, + cookies + }); + + const request = Object.assign(db.request.init(), { + _id: 'req_123', + parentId: workspace._id, + headers: [{name: 'Content-Type', value: 'application/json'}], + parameters: [{name: 'foo bar', value: 'hello&world'}], + method: 'POST', + body: 'foo bar', + url: 'http://google.com', + authentication: { + username: 'user', + password: 'pass' + } + }); + + const renderedRequest = await render.getRenderedRequest(request); + const har = harUtils.exportHarWithRequest(renderedRequest); + + expect(har.cookies.length).toBe(1); + expect(har).toEqual({ + bodySize: -1, + cookies: [{ + creation: '2016-10-05T04:40:49.505Z', + domain: 'google.com', + expires: '2096-10-12T04:40:49.000Z', + hostOnly: true, + key: 'foo', + name: 'foo', + path: '/', + value: 'barrrrr', + // lastAccessed is updated, so lets hack the assertion + lastAccessed: har.cookies[0].lastAccessed + }], + headers: [ + {name: 'Content-Type', value: 'application/json'}, + {name: 'Authorization', value: 'Basic dXNlcjpwYXNz'} + ], + headersSize: -1, + httpVersion: 'HTTP/1.1', + method: 'POST', + postData: {text: 'foo bar'}, + queryString: [{name: 'foo bar', value: 'hello&world'}], + url: 'http://google.com/' + }); + }); +}); diff --git a/app/backend/__tests__/network.test.js b/app/backend/__tests__/network.test.js index ea1e410eea..cd924f2870 100644 --- a/app/backend/__tests__/network.test.js +++ b/app/backend/__tests__/network.test.js @@ -2,7 +2,6 @@ import * as networkUtils from '../network'; import * as db from '../database'; import nock from 'nock'; import {getRenderedRequest} from '../render'; -import * as cookies from '../cookies'; describe('buildRequestConfig()', () => { beforeEach(() => db.initDB({inMemoryOnly: true}, true)); @@ -103,7 +102,7 @@ describe('actuallySend()', () => { mock = nock('http://127.0.0.1') .matchHeader('Content-Type', 'application/json') .matchHeader('Authorization', 'Basic dXNlcjpwYXNz') - .matchHeader('Cookie', 'foo=barrrrr; Expires=Fri, 12 Oct 2096 04:40:49 GMT; Path=/') + .matchHeader('Cookie', 'foo=barrrrr') .post('/') .query({'foo bar': 'hello&world'}) .reply(200, 'response body') diff --git a/app/backend/cookies.js b/app/backend/cookies.js index e99c38ea89..3b59a07db0 100644 --- a/app/backend/cookies.js +++ b/app/backend/cookies.js @@ -30,7 +30,7 @@ export function cookieHeaderValueForUri (jar, uri) { if (err) { reject(err) } else { - resolve(cookies.join('; ')); + resolve(cookies.map(c => c.cookieString()).join('; ')); } }) }) diff --git a/app/backend/export/har.js b/app/backend/export/har.js index 9c3d61add9..a47d0ca840 100644 --- a/app/backend/export/har.js +++ b/app/backend/export/har.js @@ -38,8 +38,7 @@ export async function exportHar (requestId, addContentLength = false) { function getCookies (renderedRequest) { const jar = jarFromCookies(renderedRequest.cookieJar.cookies); const domainCookies = jar.getCookiesSync(renderedRequest.url); - return domainCookies.map(c => Object.assign(c, { - name: c.key, - expires: c.expires && c.expires.toISOString ? c.expires.toISOString() : undefined + return domainCookies.map(c => Object.assign(c.toJSON(), { + name: c.key })); } diff --git a/app/backend/network.js b/app/backend/network.js index 59f7c101ba..281efa0a4d 100644 --- a/app/backend/network.js +++ b/app/backend/network.js @@ -8,7 +8,6 @@ import {jarFromCookies, cookiesFromJar} from './cookies'; import {setDefaultProtocol} from './util'; import {getRenderedRequest} from './render'; import {swapHost} from './dns'; -import {cookieHeaderForUri} from './cookies'; import {cookieHeaderValueForUri} from './cookies'; let cancelRequestFunction = null; @@ -142,7 +141,11 @@ export function _actuallySend (renderedRequest, settings) { // Update the cookie jar // NOTE: Since we're doing own DNS, we can't rely on Request to do this for (const h of util.getSetCookieHeaders(headers)) { - jar.setCookieSync(h.value, originalUrl); + try { + jar.setCookieSync(h.value, originalUrl); + } catch (e) { + console.warn('Failed to parse set-cookie', h.value); + } } const cookies = await cookiesFromJar(jar); await db.cookieJar.update(cookieJar, {cookies}); diff --git a/app/package.json b/app/package.json index 8a0f332056..2e687c3971 100644 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "insomnia", - "version": "3.5.8", + "version": "3.5.9", "productName": "Insomnia", "longName": "Insomnia REST Client", "description": "A simple and beautiful REST API client", diff --git a/app/ui/components/viewers/ResponseCookiesViewer.js b/app/ui/components/viewers/ResponseCookiesViewer.js index 9a92e8b760..2bdb210e63 100644 --- a/app/ui/components/viewers/ResponseCookiesViewer.js +++ b/app/ui/components/viewers/ResponseCookiesViewer.js @@ -23,10 +23,11 @@ const ResponseCookiesViewer = ({headers, showCookiesModal}) => {
{headers.map((h, i) => { const cookie = Cookie.parse(h.value); + return (